使用GoRouter结合BottomNavBar时重复GlobalKey错误的修复问询
核心原因
错误提示的navbarKey被多个_BodyBuilder使用,本质是同一个GlobalKey<NavigatorState>被绑定到了多个Navigator实例上,通常由以下场景导致:
修复步骤
1. 确保GoRouter是全局单例
如果你的goRouter是在Widget的build方法或initState中创建的,每次组件重建都会生成新的ShellRoute,导致同一个_shellNavigatorKey被重复绑定。
将GoRouter的初始化移到组件外部,作为全局变量,确保只初始化一次:
final _rootNavigatorKey = GlobalKey<NavigatorState>(debugLabel: 'rootKey'); final _shellNavigatorKey = GlobalKey<NavigatorState>(debugLabel: 'navbarKey'); // 全局单例,禁止在build/initState内重复创建 final goRouter = GoRouter( initialLocation: LandingPage.route, navigatorKey: _rootNavigatorKey, debugLogDiagnostics: true, routes: [ // 你的原有路由配置 ], );
2. 排查ScaffoldWithBottomNavBar内部代码
检查底部导航栏组件是否自行创建了Navigator,并且错误复用了_shellNavigatorKey。如果内部存在Navigator实例,需为它分配独立的GlobalKey,不能与ShellRoute的navigatorKey重复。
3. 解决热重载残留问题
热重载可能导致旧的Navigator实例未被正确销毁,引发key冲突。完全重启应用(而非热重载),验证错误是否消失。
4. 确认子路由pageKey的正确性
你的子路由中NoTransitionPage使用state.pageKey的方式是正确的,禁止手动指定固定key,确保每个页面的key由GoRouter自动生成。
内容的提问来源于stack exchange,提问作者Zahra
相关产品推荐
相关产品推荐

