Hi, Welcome to AndroidRide.
Animations help our app stand out from others. In Flutter, there are many built-in animated widgets. In this post, you’ll learn about the Flutter AnimatedIcon widget and how it works?.

It gets changed into one icon to another with animation.
Contents
How To Use AnimatedIcon In Flutter project?
AnimatedIcon(
            icon: AnimatedIcons.pause_play,
            progress: _animationController,
          )
AnimatedIcon needs 2 things.
- AnimatedIconData icon: Icon you want to show.
- Animationprogress : Animation for the icon.
AnimatedIcon Example In Simple Steps
Let’s start doing… Before that, What we will do next in simple steps?
- Create a Stateful widget.
- Extend the class with SingleTickerProviderStateMixin using with keyword.
- Create an AnimationController.
- Initialize the AnimationController inside initState.
- Use the AnimationController instance as progress value of AnimatedIcon.
- Control the animation through tap events.
- Dispose the AnimationController inside dispose() method.
Flutter AnimatedIcon Example
Create a Flutter project – check this tutorial.
If you are using Visual Studio – you can create a project using CTRL + SHIFT + P(windows).
I assume you have created a project, So clear the main.dart file.
- Create a stateful widget by typing stful and also add main() method.
- Or Just copy the below code.
import 'package:flutter/material.dart';
void main() => const AnimatedIconExample();
class AnimatedIconExample extends StatefulWidget {
  const AnimatedIconExample({Key? key}) : super(key: key);
  @override
  _AnimatedIconExampleState createState() => _AnimatedIconExampleState();
}
class _AnimatedIconExampleState extends State<AnimatedIconExample> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
Next we need to create an AnimationController.
- As a first step, lets extend a Mixin called SingleTickerProviderStateMixin. We are creating only one AnimationController, that’s why SingleTickerProviderStateMixin is used.
- If you have multiple AnimationController, use TickerProviderStateMixin.
- Create an AnimationController object and initialize it in initState.
class _AnimatedIconExampleState extends State<AnimatedIconExample>
    with SingleTickerProviderStateMixin {
  
  late AnimationController _animationController;
  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(seconds: 1),
    );
  }
- GestureDetector used for detecting tap events.
- Here 200 used for AnimatedIcon size, and green as color.
- AnimationController vsync property needs Ticker, that’s the reason we need to extend SingleTickerProviderStateMixin with our class.
@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GestureDetector(
          onTap: () {
           // changeIcon();
          },
          child: AnimatedIcon(
            size: 200,
            color: Colors.green,
            icon: AnimatedIcons.pause_play,
            progress: _animationController,
          ),
        ),
      ),
    );
  }
Let’s create a variable for changing animation state.
- Based on isAnimating value, icon changes one to another.
- forward() method starts running the animation forwards to end.
- reverse() method starts running the animation in reverse to beginning.
bool isAnimating = false;
void changeIcon() {
    setState(() {
      isAnimating = !isAnimating;
      isAnimating
          ? _animationController.forward()
          : _animationController.reverse();
    });
  }
- Finally, Just like TextEditingController, Animationcontroller also need to dispose in dispose method.
  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }
Check out the complete source code.
import 'package:flutter/material.dart';
void main() {
  runApp(
    const MaterialApp(
      home: AnimatedIconExample(),
    ),
  );
}
class AnimatedIconExample extends StatefulWidget {
  const AnimatedIconExample({Key? key}) : super(key: key);
  @override
  _AnimatedIconExampleState createState() => _AnimatedIconExampleState();
}
class _AnimatedIconExampleState extends State<AnimatedIconExample>
    with SingleTickerProviderStateMixin {
  late AnimationController _animationController;
  bool isAnimating = false;
  @override
  void initState() {
    super.initState();
//
    _animationController = AnimationController(
      vsync: this,//vsync needs Ticker
      duration: const Duration(seconds: 1),
    );
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GestureDetector(
          onTap: () {
//tap event calls the method, and start animating icon.
            changeIcon();
          },
          child: AnimatedIcon(
            size: 200,//size of the AnimatedIcon
            color: Colors.green,//color of the AnimatedIcon
            icon: AnimatedIcons.pause_play,
            progress: _animationController,
          ),
        ),
      ),
    );
  }
  void changeIcon() {
//rebuilds UI with changing icon.
    setState(() {
      isAnimating = !isAnimating;
      isAnimating
          ? _animationController.forward()
          : _animationController.reverse();
    });
  }
//disposes AnimationController.
  @override
  void dispose() {
    _animationController.dispose();
    super.dispose();
  }
}

Flutter AnimatedIcon List
Let’s check out the icons you can use now.
- add_event
- arrow_menu
- close_menu
- ellipsis_search
- event_add
- home_menu
- list_view
- menu_arrow
- menu_close
- menu_home
- pause_play
- play_pause
- search_ellipsis
- view_list
AnimatedIcon Properties
Color? color: Color used to paint the icon.
AnimatedIconData icon: The animated icon you need to show.
Animation
double? size: Size of the AnimatedIcon widget.
TextDirection? textDirection: The text direction used for rendering the icon.
String? semanticLabel: Available in accessibility modes (TalkBack). It doesn’t shown in the UI.
Download Source Code
If you like this post, please share it with your family and friends.
Thanks.
