flutter 如何使用GoRouter保持底部导航栏和应用程序栏?

laik7k3q  于 2023-01-06  发布在  Flutter
关注(0)|答案(2)|浏览(206)

我试图实现一个页面,底部导航和应用程序栏是固定的。但当我按下一个按钮,它会转到另一个页面,而不重新创建应用程序栏和底部导航栏。路由我使用go_router包。
使用Navigator here有一个答案。但是有没有什么方法可以使用go_router来实现呢?

示例页面:

示例主页:

xqk2d5yq

xqk2d5yq1#

这个问题在正式版本中还没有解决,但是你可以在https://github.com/flutter/packages/pull/2650中查看这个正在进行中的工作,这样就完美地解决了这个问题,希望它能很快被合并🤞🤞

j7dteeu8

j7dteeu82#

ShellRouterGoRouter配合使用以满足您的要求!

工艺路线
final _rootNavigatorKey = GlobalKey<NavigatorState>();
final _shellNavigatorKey = GlobalKey<NavigatorState>();

final router = GoRouter(
  initialLocation: '/',
  navigatorKey: _rootNavigatorKey,
  routes: [
    ShellRoute(
      navigatorKey: _shellNavigatorKey,
      pageBuilder: (context, state, child) {
        print(state.location);
        return NoTransitionPage(
            child: ScaffoldAppAndBottomBar(child: child));
      },
      routes: [
        GoRoute(
          parentNavigatorKey: _shellNavigatorKey,
          path: '/home',
          pageBuilder: (context, state) {
            return NoTransitionPage(
              child: Scaffold(
                body: const Center(
                  child: Text("Home"),
                ),
              ),
            );
          },
        ),
        GoRoute(
          path: '/',
          parentNavigatorKey: _shellNavigatorKey,
          pageBuilder: (context, state) {
            return const NoTransitionPage(
              child: Scaffold(
                body: Center(child: Text("Initial")),
              ),
            );
          },
        ),
      ],
    ),
  ],
);
脚手架应用程序和底栏
class ScaffoldAppAndBottomBar extends StatelessWidget {
  Widget child;
  ScaffoldAppAndBottomBar({super.key, required this.child});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          centerTitle: true,
          title: const Text(
            "App Bar",
          ),
          backgroundColor: Colors.amber,
        ),
        body: SafeArea(child: child),
        bottomNavigationBar: Container(
          color: Colors.blue,
          height: 56,
          width: double.infinity,
          child: const Center(child: Text("Bottom Navigation Bar")),
        ),
        floatingActionButton: FloatingActionButton(
          backgroundColor: Colors.red,
          onPressed: () {
            context.go('/home');
          },
          child: const Icon(Icons.home),
        ));
  }
}

输出:

最初

按下浮动按钮后

  • 使用ShellRouteGoRouterhere参考底部导航栏的详细代码和说明 *

相关问题