如何在Flutter Modular中结合Firebase Auth实现RouteGuard路由守卫
实现方案
核心逻辑是利用Stream的first属性获取认证状态流的首个快照值,直接转换为路由守卫需要的Future<bool>返回类型。
最简实现(直接在路由守卫中调用)
class AuthGuard extends RouteGuard { AuthGuard() : super(redirectTo: '/login'); @override Future<bool> canActivate(String path, ModularRoute router) async { // 等待获取当前最新的认证状态 final User? currentUser = await FirebaseAuth.instance.authStateChanges().first; // 用户非空返回true放行,否则返回false触发重定向 return currentUser != null; } }
结合AuthStore全局状态管理的实现
如果需要全局复用登录状态,可在状态层提前处理认证逻辑:
- 首先改造AuthStore:
class AuthStore { // 直接声明为Future<bool>类型,匹配路由守卫的返回要求 Future<bool> get isLogged async { final User? currentUser = await FirebaseAuth.instance.authStateChanges().first; return currentUser != null; } }
- 路由守卫保持官方示例的调用方式即可:
class AuthGuard extends RouteGuard { AuthGuard() : super(redirectTo: '/login'); @override Future<bool> canActivate(String path, ModularRoute router) { return Modular.get<AuthStore>().isLogged; } }
注意事项
authStateChanges().first会等待Firebase Auth初始化完成后再返回当前的实际登录状态,不会出现冷启动时误判未登录的问题- 如果需要监听登录/退出的实时状态变更,可以在AuthStore中订阅
authStateChanges()流,本地缓存登录状态,避免每次路由校验都重新取流值
内容的提问来源于stack exchange,提问作者yretuta
相关产品推荐
相关产品推荐

