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

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());
        },
      ),
    );
  }
}

排查方向及解决办法

  1. 校验isTokenExist()方法的正确性

    • 在_checkAuthorization方法中添加日志打印:print('Token查询结果: $tokenExists');,查看控制台输出是否为true。如果返回false,说明SQLite查询逻辑存在问题——检查表名、字段名是否匹配,查询条件是否正确,确认Token确实已存入数据库。
  2. 确保Firebase Auth用户状态初始化完成

    • FirebaseAuth.instance.currentUser在APP启动初期可能未完成初始化,导致拿到null进而触发未授权状态。修改代码等待Auth状态初始化:
      await FirebaseAuth.instance.authStateChanges().first;
      final user = FirebaseAuth.instance.currentUser;
      
  3. 检查CheckAuth状态类的字段映射

    • 确认CheckAuth类的构造函数是否正确将tokenExists赋值给auth属性,示例如下:
      class CheckAuth extends AuthState {
        final User? user;
        final bool auth;
        CheckAuth(this.user, this.auth);
      }
      
      若字段赋值错误,会导致后续状态判断失效。
  4. 调整页面跳转逻辑

    • 避免直接在BlocBuilder中返回页面组件,改用Navigator.pushReplacement确保状态处理完成后再跳转,避免状态重建导致的异常:
      if (state is CheckAuth) {
        WidgetsBinding.instance.addPostFrameCallback((_) {
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(
              builder: (_) => state.auth ? RootScreen() : const RegistrationScreen(),
            ),
          );
        });
      }
      

内容的提问来源于stack exchange,提问作者user16357470

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:52:48