You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Web中用go_router实现侧边栏右侧区域导航

实现Flutter Web指定区域导航(结合go_router 6.3)

你可以通过嵌套路由+ShellRoute的方式实现侧边菜单固定、仅右侧内容区切换的效果,无需手动嵌套Navigator,go_router会帮你管理导航状态。具体实现步骤如下:

1. 修改GoRouter配置,使用ShellRoute作为父布局

将原来的同级路由改为嵌套在ShellRoute下,ShellRoute的builder负责渲染固定的侧边栏布局,子路由的页面会自动填充到右侧内容区:

final GoRouter router = GoRouter(
  routes: <RouteBase>[
    ShellRoute(
      // 固定布局:侧边菜单 + 内容区
      builder: (context, state, child) {
        return Scaffold(
          body: Row(
            children: [
              const MenuWidget(), // 你的侧边菜单组件
              Expanded(child: child), // 子页面会渲染在这里
            ],
          ),
        );
      },
      // 子路由:对应各个内容页面
      routes: <RouteBase>[
        GoRoute(
          path: '/',
          pageBuilder: (context, state) => _buildCustomTransitionPage(const Info()),
        ),
        GoRoute(
          path: '/empire',
          pageBuilder: (context, state) => _buildCustomTransitionPage(const Empire()),
        ),
        GoRoute(
          path: '/chaos',
          pageBuilder: (context, state) => _buildCustomTransitionPage(const Chaos()),
        ),
      ],
    ),
  ],
);

2. 完善MenuWidget的导航逻辑

在侧边菜单组件中,使用context.go()触发路由跳转,此时只有右侧内容区会更新,侧边菜单保持不动:

class MenuWidget extends StatelessWidget {
  const MenuWidget({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 200,
      color: Colors.grey[200],
      child: Column(
        children: [
          ListTile(
            title: const Text('首页'),
            onTap: () => context.go('/'),
          ),
          ListTile(
            title: const Text('Empire'),
            onTap: () => context.go('/empire'),
          ),
          ListTile(
            title: const Text('Chaos'),
            onTap: () => context.go('/chaos'),
          ),
        ],
      ),
    );
  }
}

3. 保留自定义过渡动画(可选)

你原来的_buildCustomTransitionPage方法可以继续使用,它会为内容区的页面切换提供自定义过渡效果,不会影响固定布局:

Page<void> _buildCustomTransitionPage(Widget child) {
  return CustomTransitionPage(
    child: child,
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
      // 这里是你的自定义过渡逻辑,比如淡入淡出、滑动等
      return FadeTransition(
        opacity: animation,
        child: child,
      );
    },
  );
}

效果说明

点击侧边菜单的按钮时,只有右侧的Expanded(child: child)区域会切换对应的页面(Info/Empire/Chaos),侧边菜单始终保持显示,完全符合你想要的局部导航效果。

内容的提问来源于stack exchange,提问作者steind.VY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:13:11