Flutter中GoRouter结合Firebase Auth重定向不实时更新问题求助
解决Flutter go_router重定向不实时更新问题
问题根源
你当前的重定向逻辑只会在路由初始化或首次跳转时执行一次,当authRepo.currentUser的状态变化时,GoRouter没有收到状态更新的通知,自然不会重新触发重定向,必须热重启才能让新状态生效。
解决步骤
1. 先修复循环重定向的潜在问题
修改重定向代码,判断当前页面是否已经是目标页面,避免无限循环重定向:
redirect: (context, state) { final user = context.read<AuthBloc>().authRepo.currentUser; if (user == null) { // 当前不在登录页时才重定向 return state.location != '/login' ? '/login' : null; } else { // 当前不在根页面时才重定向 return state.location != '/root' ? '/root' : null; } },
2. 监听认证状态变化,主动触发GoRouter刷新
要让重定向逻辑实时响应用户状态变化,需要在认证状态更新时通知GoRouter重新执行重定向逻辑。可以在监听AuthBloc状态的地方调用GoRouter.refresh():
比如在根页面的初始化方法中添加监听:
@override void initState() { super.initState(); // 监听AuthBloc的状态变化 context.read<AuthBloc>().stream.listen((_) { // 状态更新时刷新GoRouter,触发重定向逻辑 GoRouter.of(context).refresh(); }); }
3. 优化:从Bloc状态中读取用户信息(更规范的做法)
建议直接从AuthBloc的状态中获取用户信息,而非直接访问repo的currentUser,更符合Bloc的状态管理逻辑:
redirect: (context, state) { final authState = context.read<AuthBloc>().state; // 假设你的AuthBloc有Authenticated和Unauthenticated两种状态 final user = authState is Authenticated ? authState.user : null; if (user == null) { return state.location != '/login' ? '/login' : null; } else { return state.location != '/root' ? '/root' : null; } },
这样只要AuthBloc的状态发生变化,配合上面的refresh()调用,GoRouter就会实时执行重定向逻辑,无需热重启。
内容的提问来源于stack exchange,提问作者Faris Armoush
相关产品推荐
相关产品推荐

