Flutter中GoRouter重定向与context.pop()的正确处理方案
解决方法
核心原因
退出登录后,原有的home、profile页面仍留在路由栈中,点击返回键时会弹出栈顶的inviteCode页面,回到栈内的受保护页面。需要从清空路由栈和强化重定向逻辑两方面处理。
方案1:退出登录时主动清空路由栈
在退出按钮的点击事件中,更新用户登录状态后,直接清空路由栈并跳转到inviteCode页面,确保栈中只有登录页面:
// ProfileScreen中的退出按钮逻辑 ElevatedButton( onPressed: () { // 1. 更新用户状态为未登录 context.read(userStateProvider.notifier).logout(); // 2. 清空路由栈并导航到inviteCode页面 GoRouter.of(context).go( '/welcome/inviteCode', clearStack: true, // 关键:清空之前的所有路由栈 ); }, child: const Text('退出登录'), )
方案2:调整路由结构,将inviteCode设为顶级路由
原配置中inviteCode是home的子路由,导致它属于home的路由分支。改成顶级路由,避免路由栈关联:
GoRouter( debugLogDiagnostics: true, errorBuilder: (context, state) => ErrorPage(state), initialLocation: '/', redirect: (context, state) { User user = context.read(userStateProvider); return !user.isLoggedIn ? '/welcome/inviteCode' : null; }, routes: <RouteBase>[ // 首页及子路由 GoRoute( path: '/', builder: (context, state) => const HomeScreen(), routes: [ GoRoute(path: 'profile', builder: (context, state) => const ProfileScreen()), ], ), // 独立的邀请码页面路由(顶级) GoRoute( path: '/welcome/inviteCode', builder: (context, state) => const InviteCodeScreen(), ), ], );
方案3:添加状态监听,确保重定向实时生效
如果希望重定向逻辑在用户状态变化时自动触发(包括通过返回键访问受保护页面的场景),可以给GoRouter添加refreshListenable,监听用户状态变化:
假设你的userStateProvider是ChangeNotifier类型:
GoRouter( debugLogDiagnostics: true, errorBuilder: (context, state) => ErrorPage(state), initialLocation: '/', // 监听用户状态变化,自动触发重定向 refreshListenable: context.read(userStateProvider), redirect: (context, state) { User user = context.read(userStateProvider); return !user.isLoggedIn ? '/welcome/inviteCode' : null; }, // 路由配置同方案2... );
这样即使用户通过返回键尝试回到home或profile,重定向逻辑会立即触发,将用户重新导向inviteCode页面。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

