Flutter中flutter_bloc结合Firebase Token实现记住用户功能异常排查
Flutter 登录状态判断异常问题排查
我正尝试在Flutter中实现登录功能,通过Firebase Token实现“记住用户”的效果,已经编写好SQLite插入方法用于存储Token。同时希望通过flutter_bloc实现页面跳转逻辑:根据本地是否存在Token,展示RootPage或RegistrationPage,但目前即便已存储Token,页面仍始终显示RegistrationPage,附上相关代码寻求解决办法:
验证用户状态的Bloc代码
on<CheckAuthorizationEvent>(_checkAuthorization); } void _checkAuthorization( CheckAuthorizationEvent event, Emitter<AuthState> emit) async { try { final user = FirebaseAuth.instance.currentUser; if (user == null) { emit(const CheckAuth(null, false)); } else { final tokenExists = await sQlService.isTokenExist(); emit(CheckAuth(user, tokenExists)); } } on FirebaseAuthException catch (e) { emit(AuthErrorState(e.getErrorMessage())); } }
页面跳转逻辑代码
class _EnterPageState extends State<EnterPage> { @override void initState() { super.initState(); final authBloc = BlocProvider.of<AuthBloc>(context); authBloc.add(CheckAuthorizationEvent()); } @override Widget build(BuildContext context) { return Scaffold( body: BlocBuilder<AuthBloc, AuthState>( builder: (context, state) { if (state is CheckAuth) { if (state.auth) { return RootScreen(); } else { return const RegistrationScreen(); } } return const Center(child: CircularProgressIndicator()); }, ), ); } }
排查方向及解决办法
校验
isTokenExist()方法的正确性- 在
_checkAuthorization方法中添加日志打印:print('Token查询结果: $tokenExists');,查看控制台输出是否为true。如果返回false,说明SQLite查询逻辑存在问题——检查表名、字段名是否匹配,查询条件是否正确,确认Token确实已存入数据库。
- 在
确保Firebase Auth用户状态初始化完成
FirebaseAuth.instance.currentUser在APP启动初期可能未完成初始化,导致拿到null进而触发未授权状态。修改代码等待Auth状态初始化:await FirebaseAuth.instance.authStateChanges().first; final user = FirebaseAuth.instance.currentUser;
检查
CheckAuth状态类的字段映射- 确认
CheckAuth类的构造函数是否正确将tokenExists赋值给auth属性,示例如下:
若字段赋值错误,会导致后续状态判断失效。class CheckAuth extends AuthState { final User? user; final bool auth; CheckAuth(this.user, this.auth); }
- 确认
调整页面跳转逻辑
- 避免直接在
BlocBuilder中返回页面组件,改用Navigator.pushReplacement确保状态处理完成后再跳转,避免状态重建导致的异常:if (state is CheckAuth) { WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.pushReplacement( context, MaterialPageRoute( builder: (_) => state.auth ? RootScreen() : const RegistrationScreen(), ), ); }); }
- 避免直接在
内容的提问来源于stack exchange,提问作者user16357470
相关产品推荐
相关产品推荐

