如何给Navigator.pushNamed指定路由动画,不使用push方法
可以通过以下两种方式给Navigator.pushNamed指定路由动画:
- 在MaterialApp中指定路由动画
在MaterialApp的构造函数中,可以通过设置navigatorKey和onGenerateRoute属性来指定Navigator的配置。其中,navigatorKey用于获取NavigatorState对象,onGenerateRoute用于生成路由并指定路由动画。例如:
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
MaterialApp(
navigatorKey: navigatorKey,
onGenerateRoute: (settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(
builder: (_) => HomePage(),
settings: settings,
);
case '/detail':
return PageRouteBuilder(
pageBuilder: (_, __, ___) => DetailPage(),
transitionDuration: Duration(seconds: 1),
transitionsBuilder: (_, animation, __, child) {
return SlideTransition(
position: Tween(begin: Offset(1, 0), end: Offset(0, 0)).animate(animation),
child: child,
);
},
);
default:
return MaterialPageRoute(
builder: (_) => UnknownPage(),
settings: settings,
);
}
},
);
在上述代码中,onGenerateRoute定义了三个路由:'/','/detail'和其他未知路由。对于'/detail'路由,我们使用PageRouteBuilder指定了一个从右侧滑入的动画效果。
然后,在需要跳转到'/detail'路由的地方,可以使用以下代码:
navigatorKey.currentState.pushNamed('/detail');
这个方法会自动根据onGenerateRoute中定义的路由生成DetailPage,并指定路由动画。
- 使用PageRouteBuilder手动指定路由动画
如果不想在MaterialApp中指定路由动画,也可以在跳转路由时使用PageRouteBuilder手动指定路由动画。例如:
Navigator.of(context).push(
PageRouteBuilder(
pageBuilder: (_, __, ___) => DetailPage(),
transitionDuration: Duration(seconds: 1),
transitionsBuilder: (_, animation, __, child) {
return SlideTransition(
position: Tween(begin: Offset(1, 0), end: Offset(0, 0)).animate(animation),
child: child,
);
},
),
);
这个方法不使用Navigator.pushNamed,而是直接使用Navigator.of(context).push方法,并将PageRouteBuilder作为参数传入。在PageRouteBuilder中,我们指定了一个从右侧滑入的动画效果。
需要注意的是,这种方式不能像第一种方式一样自动根据路由名称生成路由页面。因此,需要手动指定路由页面的构造函数。
原文地址: https://www.cveoy.top/t/topic/zxs 著作权归作者所有。请勿转载和采集!