How to navigate to other page without animation Flutter

前端 未结 6 1626
暖寄归人
暖寄归人 2020-12-03 09:43

I have a Login page, when I log on to go to the main page of my app i am using Navigator.pushReplacement(context, new MaterialPageRoute(builder: (BuildContext context)

相关标签:
6条回答
  • 2020-12-03 10:15

    You can use PageRouteBuilder.

     Navigator.pushReplacement(
          context, 
          PageRouteBuilder(
            pageBuilder: (context, animation1, animation2) => Page1(),
            transitionDuration: Duration(seconds: 0),
        ),
    );
    
    0 讨论(0)
  • 2020-12-03 10:17

    My solution is to define the route with isInitialRoute:true. This prevents Flutter from showing an animation when the route is pushed.

    Here's a working example and screen recording:

    import 'package:flutter/cupertino.dart'
        show
            CupertinoApp,
            CupertinoButton,
            CupertinoPageRoute,
            CupertinoPageScaffold;
    import 'package:flutter/widgets.dart'
        show
            BuildContext,
            Center,
            Column,
            Navigator,
            Route,
            RouteSettings,
            SafeArea,
            Spacer,
            Text,
            runApp,
            Widget;
    
    Widget makeButton(BuildContext context, String routeName) =>
        new CupertinoButton(
          onPressed: () => Navigator.pushReplacementNamed(context, routeName),
          child: Text('Go to \'$routeName\''),
        );
    
    Route generateRoute(RouteSettings settings) {
      switch (settings.name) {
        case 'not-animated':
          return new CupertinoPageRoute(
            settings: RouteSettings(name: settings.name, isInitialRoute: true),
            builder: (context) => CupertinoPageScaffold(
                  child: SafeArea(
                    child: Center(
                      child: Column(
                        children: [
                          Spacer(),
                          Text('This is \'not-animated\''),
                          makeButton(context, 'animated'),
                          Spacer(),
                        ],
                      ),
                    ),
                  ),
                ),
          );
        default:
          return null;
      }
    }
    
    void main() {
      runApp(
        CupertinoApp(
          onGenerateRoute: generateRoute,
          initialRoute: 'animated',
          routes: {
            'animated': (context) => CupertinoPageScaffold(
                  child: SafeArea(
                    child: Center(
                      child: Column(
                        children: [
                          Spacer(),
                          Text('This is \'animated\''),
                          makeButton(context, 'not-animated'),
                          Spacer(),
                        ],
                      ),
                    ),
                  ),
                ),
          },
        ),
      );
    }
    

    0 讨论(0)
  • 2020-12-03 10:23

    You should try to extend MaterialPageRoute and override buildTransitions as follows:

    class ExPageRoute<T> extends MaterialPageRoute<T> {
    
     @override
     Widget buildTransitions(BuildContext context, Animation<double> animation,
        Animation<double> secondaryAnimation, Widget child) {
        return child;
     }
    }
    
    0 讨论(0)
  • 2020-12-03 10:25

    You can override MaterialPageRoute to set transitionDuration to zero

    class CustomPageRoute extends MaterialPageRoute {
      CustomPageRoute({builder}) : super(builder: builder);
    
      @override
      Duration get transitionDuration => const Duration(milliseconds: 0);
    }
    
    ...
    
    Navigator.of(context).push(
      CustomPageRoute(
        builder: (BuildContext context) {
          return DashboardView();
        },
      ),
    );
    
    0 讨论(0)
  • 2020-12-03 10:27

    Make sure you also set transitionDuration otherwise you may push the new route without animation but when you press back button, you'll see some delay.

    Navigator.push(
      context,
      PageRouteBuilder(
        pageBuilder: (_, __, ___) => Screen2(),
        transitionDuration: Duration(seconds: 0),
      ),
    );
    
    0 讨论(0)
  • 2020-12-03 10:28

    You would need to override the buildTransitions method to prevent animations.

    import 'package:flutter/material.dart';
    
    class NoAnimationMaterialPageRoute<T> extends MaterialPageRoute<T> {
      NoAnimationMaterialPageRoute({
        @required WidgetBuilder builder,
        RouteSettings settings,
        bool maintainState = true,
        bool fullscreenDialog = false,
      }) : super(
                builder: builder,
                maintainState: maintainState,
                settings: settings,
                fullscreenDialog: fullscreenDialog);
    
      @override
      Widget buildTransitions(BuildContext context, Animation<double> animation,
          Animation<double> secondaryAnimation, Widget child) {
        return child;
      }
    }
    
    0 讨论(0)
提交回复
热议问题