Search code examples
animationflutternavigation

How to change navigation animation using Flutter


Is there any way to change the default animation when navigating to/from a page in Flutter?


Solution

  • You can achieve this by using CupertinoPageRoute. Please check the below code.

    import 'package:flutter/material.dart';
    import 'package:flutter/cupertino.dart';
    
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Transition Animation Demo',
          theme: new ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: new FirstPage(),
        );
      }
    }
    
    class FirstPage extends StatefulWidget {
      @override
      _FirstPageState createState() => new _FirstPageState();
    }
    
    class _FirstPageState extends State<FirstPage> {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('First Page'),
          ),
          body: new Center(
            child: new RaisedButton(
              child: new Text('Goto Second Page'),
              onPressed: () {
                Navigator.of(context).push(new SecondPageRoute());
              },
            ),
          ),
        );
      }
    }
    
    class SecondPageRoute extends CupertinoPageRoute {
      SecondPageRoute()
          : super(builder: (BuildContext context) => new SecondPage());
    
    
      // OPTIONAL IF YOU WISH TO HAVE SOME EXTRA ANIMATION WHILE ROUTING
      @override
      Widget buildPage(BuildContext context, Animation<double> animation,
          Animation<double> secondaryAnimation) {
        return new FadeTransition(opacity: animation, child: new SecondPage());
      }
    }
    
    class SecondPage extends StatefulWidget {
      @override
      _SecondPageState createState() => new _SecondPageState();
    }
    
    class _SecondPageState extends State<SecondPage> {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('Second Page'),
          ),
          body: new Center(
            child: new Text('This is the second page'),
          ),
        );
      }
    }
    

    Some play-around with animation

      // OPTIONAL IF YOU WISH TO HAVE SOME EXTRA ANIMATION WHILE ROUTING
      @override
      Widget buildPage(BuildContext context, Animation<double> animation,
          Animation<double> secondaryAnimation) {
        return new RotationTransition(
            turns: animation,
            child: new ScaleTransition(
              scale: animation,
              child: new FadeTransition(
                opacity: animation,
                child: new SecondPage(),
              ),
            ));
      }