【问题标题】:Flutter: Changing page transition in Navigator 2.0Flutter:在 Navigator 2.0 中更改页面转换
【发布时间】:2021-09-21 19:33:46
【问题描述】:

我有一个Router,它的工作原理如下: 第一步创建了一个MaterialPage

return MaterialPage(
      child: SomePage(),
      key: keyName,
      name: pageName,
      arguments: routeSettings.arguments,
    );

并添加到Pages 的数组中,然后调用notifyListeners()。这个路由器类有一个像这样的build 方法:

return Navigator(
      key: navigatorKey,
      pages: List.of(_pages),
      onPopPage: _onPopPage,
    );

现在我的问题是,在这样的设置中,某些页面的页面转换在哪里可以更改?我试图使用page_transition 包,但它返回一个PageTransition 对象而不是Widget,这是MaterialPage 所必需的。

【问题讨论】:

  • 你找到解决方案了吗?

标签: flutter flutter-navigation


【解决方案1】:

您可以使用PageRouteBuilder 来实现不同的页面转换。例如幻灯片动画:

class SlideRoute extends PageRouteBuilder {
  final Widget page;
  final RouteSettings settings;
  SlideRoute({required this.page, required this.settings})
      : super(
          pageBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
          ) =>
              page,
          settings: settings,
          transitionsBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child,
          ) =>
              SlideTransition(
            position: Tween<Offset>(
              begin: const Offset(1, 0),
              end: Offset.zero,
            ).animate(animation),
            child: child,
          ),
        );
}

然后你可以在返回路由时使用它,例如onGenerateRouteMaterialApp

MaterialApp(
  onGenerateRoute: (settings) {
    switch (settings.name) {
      case '/route1':
        return SlideRoute(page: Route1(), settings: settings);
      case '/route2':
        return SlideRoute(page: Route2(), settings: settings);
    }
  },
)

【讨论】:

  • 它不适用于我的设置,是不是因为我在GetMaterialApp中设置了router
  • @Maysam 你的意思是routes?是的,我认为您必须设置routesonGenerateRoute。要使PageRouteBuilder 正常工作,请尝试删除routes 并像我的回答一样定义它们。
  • 这对我不起作用,我需要保留路线。
  • 很抱歉。只是好奇:为什么?基本上定义路由的一种方法是设置routes 属性,另一种是onGenerateRoute。在幕后,这些非常相似。而且如果要插入动画,恐怕routes是不行的。
  • 因为我有一个路由器类来解析和注入所需的变量和依赖项到页面中
猜你喜欢
  • 2021-06-22
  • 2021-02-12
  • 2021-10-25
  • 2021-03-16
  • 1970-01-01
  • 2020-02-06
  • 2019-07-29
  • 2018-10-21
  • 1970-01-01
相关资源
最近更新 更多