Flutter,在使用 WidgetBuilder 配置我的路由时不确定如何实现 PageRouteBuilder()

Flutter, not sure how to implement a PageRouteBuilder(), when using a WidgetBuilder to configure my routes

  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: codGray,
      body: Navigator(
        key: _navigatorKey,
        initialRoute: '/',
        onGenerateRoute: (RouteSettings settings) {
          WidgetBuilder builder;
          // Manage your route names here
          switch (settings.name) {
            case '/':
              builder = (BuildContext context) => ProviderPage();
              break;
            case '/chats':
              builder = (BuildContext context) => ChatProviderPage();
              break;
            case '/addPoll':
              builder = (BuildContext context) => AddPollPage();
              break;
            case '/friends':
              builder = (BuildContext context) => ProfileProviderPage();
              break;
            case '/settings':
              builder = (BuildContext context) => SettingsProviderPage();
              break;
            default:
              throw Exception('Invalid route: ${settings.name}');
          }
          return MaterialPageRoute(
            builder: builder,
            settings: settings,
          );
        },
      ),
}

这是我的项目的一个片段,我试图在页面之间转换时实现自定义动画,但是由于我使用自定义导航器进行路由,它使用 WidgetBuilder,所以我不确定如何实现自定义 PageRouteBuilder(),它使用 WidgetBuilder 构建器在页面之间进行转换。

您可以像这样直接 return MaterialPageRoutePageRouteBuilder 来做到这一点。

Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: codGray,
      body: Navigator(
        key: _navigatorKey,
        initialRoute: '/',
        onGenerateRoute: (RouteSettings settings) {
          switch (settings.name) {
            case '/':
              return MaterialPageRoute(
                builder: (BuildContext context) => ProviderPage(),
                settings: settings,
              );
            case '/chats':
              return MaterialPageRoute(
                builder: (BuildContext context) => ChatProviderPage(),
                settings: settings,
              );
            case '/customTransition':
              return PageRouteBuilder(
                pageBuilder: (context, animation, secondaryAnimation) => Page(),
                transitionsBuilder: (context, animation, secondaryAnimation, child) {
                  return child;
                },
              );
            default:
              throw Exception('Invalid route: ${settings.name}');
          }
        },
      ),
}

虽然你可以在这里重构很多东西,使其更具可读性和可维护性

  1. 您可以在 Navigator 小部件
  2. 中提取给定 onGenerateRoute 参数的这个函数
  3. 为路由使用常量。它使它更易读,并且不易因打字错误而出错。
  4. 您可以使用自己的 class 创建扩展 PageRouteBuilder,它采用 Widget 类型的子参数,其余所有转换逻辑都在 class 中。