Flutter导航器Navigator.pushNamed()自定义路由动画

6
我想在Navigator.pushNamed()中使用我的CustomPageRoute,但我找不到如何使用它的方法。
然而,我可以按照以下方式使用它。
Navigator.push(context, CustomPageRoute(builder: (context) => MyPage()));

这是我的路由:

"/page": (context) => MyPage(), // Can I use CustomPageRoute here, if yes then how?

请查看 onGenerateRoute 属性。 - pskink
@pskink 谢谢,我知道可以使用 onGenerateRoute 来实现,但是这个属性通常用于没有静态路由且需要传递一些信息的情况。在我的情况下,我有静态路由并且不需要传递任何信息。 - user6274128
如果您不想使用它,那么您必须接受默认路由。 - pskink
@pskink 看起来这似乎是目前的解决方案,不过让我们等待看看是否会有人想到新的想法。 - user6274128
这是必须使用return widget.onGenerateRoute(settings)(第766行)的地方:https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/app.dart#L747 - 在第748行设置断点并逐步调试。 - pskink
1
@pskink 那么这意味着唯一的继续方式是使用 onGenerateRoute 吗?如果是的话,请将其写下作为答案,我很乐意接受。谢谢 - user6274128
2个回答

9

最近我遇到了相同的问题,并使用 onGeneratePageRoute 钩子函数进行了“修复”。

也就是说,创建一个方法来动态生成路由:

  static Route<dynamic> _onGenerateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/onboarding':
        return MyCustomPageRoute(builder: (context) => OnboardingScreen(), settings: settings);
    }
    throw UnsupportedError('Unknown route: ${settings.name}');
  }

并将其设置为MaterialApp中的onGenerateRoute

onGenerateRoute: _onGenerateRoute,

看起来你可能已经根据之前的评论弄清楚了,但我想让这对像我这样的未来的人更容易一些!

注意: 确保路由名称(在本例中为/onboarding)没有在你的MaterialApp中也被定义并设置为routes,否则它只会在从正常路由中无法解析时触发你的onGenerateRoute


2
你可以使用这个包page_transition,并在MaterialApp中使用onGenerateRoute,然后...
onGenerateRoute: (settings) {
    switch (settings.name) {
      case '/second':
        return PageTransition(
          child: SecondPage(),
          type: PageTransitionType.scale,
          settings: settings,
        );
        break;
      default:
        return null;
    }
  },

请确保在声明了route:之后不要包含路由,因为这会绕过您想要的onGenerateRoute动画。

使用时,只需像平常一样使用Navigator.pushNamed(context, '/second');


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接