状态变更时AutoRoute未更新,监听Provider无响应问题求助
问题原因及修复方案
1. AuthGuard中使用了全新的AuthProvider实例
你的AuthGuard每次执行onNavigation时都会创建一个新的AuthProvider:
final AuthProvider appState = AuthProvider();
这个新实例的isLoggedIn始终是初始值false,和你全局维护的用户状态完全无关,导致守卫逻辑永远无法正确判断用户登录状态。
修复:
通过resolver.context获取全局共享的AuthProvider实例:
class AuthGuard extends AutoRouteGuard { @override void onNavigation(NavigationResolver resolver, StackRouter router) async { final authProvider = Provider.of<AuthProvider>(resolver.context, listen: false); if (authProvider.isLoggedIn) { resolver.next(true); } else { resolver.redirect(const AuthRoute()); } } }
2. 确保全局AuthProvider实例的一致性
检查应用顶层是否正确提供了AuthProvider单例,必须在MaterialApp外层包裹ChangeNotifierProvider:
@override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (_) => AuthProvider(), // 全局唯一实例 child: Consumer<AuthProvider>( builder: (context, authProvider, child) { return MaterialApp.router( theme: darkTheme, routerConfig: _appRouter.config( reevaluateListenable: authProvider, navigatorObservers: () => [ TalkerRouteObserver(GetIt.I<Talker>()), ], ), title: 'Flutter Demo', ); }, ), ); }
只有全局使用同一个AuthProvider实例,reevaluateListenable才能监听到正确的状态变化。
3. 验证状态变化后的路由触发逻辑
当调用authProvider.login()并执行notifyListeners()后,reevaluateListenable会通知auto_route重新运行所有路由守卫逻辑:
- 若当前在登录页,登录成功后守卫会自动跳转至需登录权限的目标页面
- 若用户尝试访问需登录的页面,守卫会直接放行
如果仍未自动跳转,可在登录成功后手动触发导航作为补充:
void onPressedMethod(bool isRegister) { final authProvider = Provider.of<AuthProvider>(context, listen: false); authProvider.login(); // 手动跳转首页示例 AutoRouter.of(context).replace(const HomeRoute()); }
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

