Flutter BottomAppBar Animation Placeholder Issue

This article addresses an issue where a placeholder widget, appearing as the default Material bottom navigation bar theme, is displayed while animating a conditionally hidden BottomAppBar using a SlideTransition in Flutter.

Problem Description

When using a SlideTransition to animate a BottomAppBar that is conditionally hidden, a placeholder widget, resembling the default Material design bottom navigation bar, briefly appears before the animated BottomAppBar comes into view. This is noticeable even if the bottom navigation bar’s color is set to transparent.

Solution

The problem arises because the SlideTransition only animates the BottomAppBar‘s position. Flutter needs to know the exact size and position of the widget to smoothly animate. Setting the background color to transparent is not sufficient to prevent this placeholder from appearing. The trick is to use the AnimatedContainer widget to handle the animation of the BottomAppBar‘s visibility.

Revised Code


import 'package:flutter/material.dart';

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State createState() => _MyHomePageState();
}

class _MyHomePageState extends State with SingleTickerProviderStateMixin {
  late AnimationController _animationController;
  bool _isBottomAppBarVisible = false;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 300),
    )..addListener(() {
      setState(() {});
    });
  }

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


  void _toggleBottomAppBarVisibility() {
    setState(() {
      _isBottomAppBarVisible = !_isBottomAppBarVisible;
      if (_isBottomAppBarVisible) {
        _animationController.forward();
      } else {
        _animationController.reverse();
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Animated BottomAppBar')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(onPressed: _toggleBottomAppBarVisibility, child: Text(_isBottomAppBarVisible ? 'Hide Bottom App Bar' : 'Show Bottom App Bar')),
          ],
        ),
      ),
      bottomNavigationBar: AnimatedContainer(
        duration: const Duration(milliseconds: 300),
        curve: Curves.easeInOut,
        height: _isBottomAppBarVisible ? 60 : 0,
        child: _isBottomAppBarVisible
            ? BottomAppBar(
                color: Colors.blue,
              )
            : Container(),
      ),
    );
  }
}

Explanation

  • AnimatedContainer: This widget handles the animation of the BottomAppBar‘s height. Crucially, when the BottomAppBar is hidden, we use Container() with height 0, which helps Flutter avoid the placeholder.
  • Visibility vs. AnimatedContainer: While Visibility can hide the widget, it does not control the animation of the height, leading to the placeholder issue. AnimatedContainer is specifically designed to handle both the visibility and animation of the height.
  • AnimationController: The AnimationController is used to manage the animation. This is now correctly set up for smooth animation.
  • Height Property: The height property is set conditionally to control the visibility.

Potential Errors and Solutions

Error Solution
Missing AnimationController or AnimatedContainer Add the required widgets and configure them correctly.
Incorrect Animation duration Adjust the duration in the AnimationController to match your desired speed.

This revised approach ensures a smooth animation without the placeholder and provides a more robust solution for conditionally animating the BottomAppBar in your Flutter application.