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

状态变更时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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:56:23