Flutter go_router ShellRoute

ShellRoutego_router 路由库中的一个类,它的主要功能是在匹配的子路由周围显示一个 UI shell。

ShellRoute 提供了一种机制,允许开发者为一组子路由定义一个统一的用户界面(UI)结构,这个结构被称为 "UI shell"。这个 "UI shell" 可以包含一些常见的 UI 元素,如导航栏、侧边栏、底部导航等,这些元素在多个页面中都是相同或相似的。

举个例子,假设您正在开发一个应用,其中有三个页面:首页、消息页和设置页。这三个页面都有一个相同的顶部导航栏。而不是在每个页面单独定义这个导航栏,您可以使用 ShellRoute 来定义一个 UI shell,其中包含这个导航栏,然后将这三个页面作为子路由添加到这个 shell 中。这样,当用户在这三个页面之间导航时,导航栏始终保持一致,并且只需要定义一次。

功能

ShellRoute 被添加到 GoRouterGoRoute 的路由列表中时,它会使用新的 Navigator 来显示任何匹配的子路由,而不是将它们放在根 Navigator 上。

使用方法

要在不同的 Navigator 上显示子路由,为其提供一个与 GoRouterShellRoute 构造函数中提供的键匹配的 parentNavigatorKey

由匹配的子路由构建的小部件成为构建器的子参数。

示例

final GlobalKey<NavigatorState> _rootNavigatorKey =
	GlobalKey<NavigatorState>();
	
final GoRouter _router = GoRouter(
  navigatorKey: _rootNavigatorKey,
  initialLocation: '/a',
  routes: [
    ShellRoute(
      navigatorKey: _shellNavigatorKey,
      builder: (context, state, child) {
        return ScaffoldWithNavBar(child: child);
      },
      routes: [
        GoRoute(
          path: '/a',
          builder: (context, state) {
            return const ScreenA();
          },
          routes: <RouteBase>[
            GoRoute(
              path: 'details',
              builder: (
              BuildContext context,
               GoRouterState state) {
                return const DetailsScreen(label: 'A');
              },
            ),
          ],
        ),
        GoRoute(
          path: '/b',
          builder: (
	       BuildContext context,
           GoRouterState state) {
            return const ScreenB();
          },
          routes: <RouteBase>[
            GoRoute(
              path: 'details',
              parentNavigatorKey: _rootNavigatorKey,
              builder: (
               BuildContext context,
               GoRouterState state) {
                return const DetailsScreen(label: 'B');
              },
            ),
          ],
        ),
      ],
    ),
  ],
);

构建器示例

ShellRoute(
  builder: (
	  BuildContext context, 
	  GoRouterState state, 
	  Widget child) {
    return Scaffold(
      appBar: AppBar(
        title: Text('App Shell')
      ),
      body: Center(
        child: child,
      ),
    );
  },
  routes: [
    GoRoute(
      path: 'a'
      builder: (
	      BuildContext context, 
	      GoRouterState state) {
        return Text('Child Route "/a"');
      }
    ),
  ],
);

本文作者:Maeiee

本文链接:Flutter go_router ShellRoute

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!