Flutter Animation Techniques

By Ahmed Abidi September 7, 2025 5 min read Flutter

Flutter Animation Techniques

Unlock the power of animations in Flutter with practical examples and best practices.

Table of Contents

  1. Introduction
  2. Basic Animations
  3. AnimatedContainer
  4. AnimatedOpacity
  5. AnimatedPositioned
  6. Custom Animations
  7. Best Practices
  8. Conclusion

Introduction

Animations play a crucial role in creating engaging and interactive user interfaces. Flutter provides a rich set of tools and widgets to create smooth and efficient animations. In this post, we'll explore various animation techniques in Flutter with practical examples and best practices.

Basic Animations

Flutter offers several built-in widgets to create basic animations. Let's start with some simple examples.

AnimatedContainer

The AnimatedContainer widget allows you to animate changes to its properties.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('AnimatedContainer Example')),
        body: Center(
          child: AnimatedContainer(
            duration: Duration(seconds: 2),
            width: 100,
            height: 100,
            color: Colors.blue,
            curve: Curves.easeInOut,
          ),
        ),
      ),
    );
  }
}

AnimatedOpacity

The AnimatedOpacity widget animates the opacity of its child.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State {
  bool _visible = true;

  void _toggleVisibility() {
    setState(() {
      _visible = !_visible;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('AnimatedOpacity Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              AnimatedOpacity(
                opacity: _visible ? 1.0 : 0.0,
                duration: Duration(seconds: 2),
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.green,
                ),
              ),
              ElevatedButton(
                onPressed: _toggleVisibility,
                child: Text('Toggle Visibility'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

AnimatedPositioned

The AnimatedPositioned widget animates the position of its child.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State {
  bool _dragging = false;

  void _toggleDrag() {
    setState(() {
      _dragging = !_dragging;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('AnimatedPositioned Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              AnimatedPositioned(
                duration: Duration(seconds: 2),
                top: _dragging ? 100 : 200,
                left: _dragging ? 100 : 200,
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.red,
                ),
              ),
              ElevatedButton(
                onPressed: _toggleDrag,
                child: Text('Toggle Drag'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Custom Animations

For more complex animations, you can use the AnimationController and Animation classes.

Custom Animation Example

Here's an example of a custom animation using AnimationController and Tween.


import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State with SingleTickerProviderStateMixin {
  AnimationController _controller;
  Animation _animation;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 2),
      vsync: this,
    )..repeat(reverse: true);
    _animation = Tween(begin: 0.0, end: 1.0).animate(_controller);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Custom Animation Example')),
        body: Center(
          child: AnimatedBuilder(
            animation: _animation,
            builder: (context, child) {
              return Transform.rotate(
                angle: _animation.value * 2.0 * 3.141592653589793,
                child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.purple,
                ),
              );
            },
          ),
        ),
      ),
    );
  }
}

Best Practices

Here are some best practices for working with animations in Flutter:

  • Use AnimatedWidget to animate properties of a widget.
  • For complex animations, use AnimationController and Animation.
  • Dispose of the AnimationController in the dispose method.
  • Use AnimatedBuilder to rebuild the widget tree based on the animation value.
  • Consider performance implications and avoid overusing animations.
  • Use curve to control the timing curve of the animation.

Conclusion

Animations can greatly enhance the user experience in your Flutter apps. By using the built-in widgets and custom animations, you can create smooth and engaging transitions. Remember to follow best practices to ensure optimal performance.

In the next steps, you can explore more advanced animation techniques, such as combining multiple animations and using the AnimationGroup widget. Happy animating!

Back to Blog