如何在没有动画的情况下导航到其他页面

Mau*_*mas 12 navigation flutter

我有一个登录页面,当我登录以转到我正在使用的应用程序主页时, Navigator.pushReplacement(context, new MaterialPageRoute(builder: (BuildContext context) => new Page1())); 但是它具有幻灯片动画,我想禁用它。

这是我的Material应用格式

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new Login(title: 'Login'),
      routes: <String, WidgetBuilder>{
        '/screen3': (BuildContext context) => new Page1(),
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Edw*_*Liu 69

您可以使用PageRouteBuilder.

 Navigator.pushReplacement(
      context, 
      PageRouteBuilder(
        pageBuilder: (context, animation1, animation2) => Page1(),
        transitionDuration: Duration.zero,
    ),
);
Run Code Online (Sandbox Code Playgroud)

  • 添加transitionDuration: Duration(秒: 0),以立即进行转换。 (10认同)
  • 添加 `reverseTransitionDuration: Duration.zero` 以避免延迟弹出! (8认同)

Pav*_*tov 14

您可以覆盖MaterialPageRoute以将transitionDuration设置为零

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();
    },
  ),
);
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案也可以用于pushNamed吗?如果是这样,怎么办? (8认同)

Cop*_*oad 13

确保你也设置了transitionDuration否则你可能会在没有动画的情况下推送新路线,但是当你按下后退按钮时,你会看到一些延迟。

Navigator.push(
  context,
  PageRouteBuilder(
    pageBuilder: (_, __, ___) => Screen2(),
    transitionDuration: Duration(seconds: 0),
  ),
);
Run Code Online (Sandbox Code Playgroud)

  • 还有“reverseTransitionDuration”,您也可以将其设置为“0”。 (6认同)

lsa*_*don 8

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;
  }
}
Run Code Online (Sandbox Code Playgroud)


M. *_*ard 8

我的解决方案是用isInitialRoute:true. 这可以防止 Flutter 在推送路由时显示动画。

这是一个工作示例和屏幕录制:

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(),
                    ],
                  ),
                ),
              ),
            ),
      },
    ),
  );
}
Run Code Online (Sandbox Code Playgroud)

屏幕录制

  • 实现简单结果的最简单方法:不使用动画进行导航。谢谢! (2认同)
  • isInitialRoute 已被删除(https://github.com/flutter/flutter/issues/51649) (2认同)

Ivá*_*oed 6

如果您想使用包,通过get 包,您可以禁用具有 属性的过渡动画GetMaterialApp

GetMaterialApp(
  defaultTransition: Transition.noTransition, //this would be the solution
  transitionDuration: transitionDuration: Duration(seconds: 0),
);
Run Code Online (Sandbox Code Playgroud)

然后只需添加其他所需的属性即可。


小智 5

您应该尝试扩展 MaterialPageRoute 并覆盖 buildTransitions,如下所示:

class ExPageRoute<T> extends MaterialPageRoute<T> {

 @override
 Widget buildTransitions(BuildContext context, Animation<double> animation,
    Animation<double> secondaryAnimation, Widget child) {
    return child;
 }
}
Run Code Online (Sandbox Code Playgroud)