Tavon Gatling
tavon.dev / GatlingXYZ


tavon.dev / GatlingXYZ


Flutter: Animations!

Tavon Gatling's photo
Tavon Gatling
·Mar 9, 2021·

2 min read

In Android, we can typically do very simple animations by setting animateLayoutChanges to true in the ViewGroup of our layout's XML. It's been my tried and true method for a long time now. Anything more advanced than maybe changes to how a Dialog or Activity is shown has caused headaches that ended up not being worth the trouble.

Therefore I haven't done a lot with animations, and am envious of those who have accomplished more.

While sprucing up my job's Flutter app, I wanted to make an expandable/collapsable area to show and hide some content. The user would click a button, and it would drop down revealing more of the information that was peeking through.

That's when I discovered the simplicity of Flutter animations.

Maybe it's like this in Android, too, and I've just been woefully ignorant of them. I know there's something about a ValueAnimator, but... eh, it's not as simple as this!

Widget _buildCollapsableWidget() {
        var expandedWidget = _makeExpandedWidget();
        var collapsedWidget = _makeCollapsedWidget();
    return Container(
      child: AnimatedCrossFade(
        alignment: Alignment.center,
        crossFadeState: _isExpanded ? CrossFadeState.showFirst : CrossFadeState.showSecond,
        duration: Duration(milliseconds: animationDuration),
        firstChild: expandedWidget,
        secondChild: collapsedWidget,
        sizeCurve: Curves.linearToEaseOut,

Using AnimatedCrossFade, I have accomplished what I was looking for: a smooth open and close animation. And it's easily customizable!

When the user presses a button, I updated _isExpanded. I use a ValueNotifier for this (something else I learned about) but setState should work just as well.

There's a gajillion different Curves to use; the one I have selected starts off in a very straight, then curves out to slow down towards the end of the animation. You can look at a video of the Curve here. (Sidenote: I love the Flutter docs.)

That's... honestly it. It's super simple. I added a similar animation to the button the user presses, switching between an Up caret and a Down one, however for that I use an AnimatedSwitcher.

// Other code here
return AnimatedSwitcher(
    duration: Duration(milliseconds: 600),
    transitionBuilder: (Widget child, Animation<double> animation) {
      return ScaleTransition(child: child, scale: animation);
  child: _caretWidget,
  switchInCurve: Curves.bounceOut,

I'm trying to find more and more excuses to throw in an animation: they're so simple, and provide just a bit of extra polish. It makes the app feel a bit more alive and modern.

Flutter offers a ton of easy-to-use animated Widgets, as well as a bunch of ready-to-use Transitions. Above, I used the ScaleTransition, but there are ones for Size, Rotation, and even Position. The AnimatedWidget docs page provides details on these.

Have you had a chance to use Flutter animations yet? If so, what've you built with it? Show me what you've made and help inspire everyone!

Share this