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

Firebase Auth Exception未被catch捕获,错误凭证登录致应用崩溃

FirebaseAuthException无法被捕获导致应用崩溃

当使用错误凭证登录时,系统会按预期抛出FirebaseAuthException,但代码中的catch块无法捕获该异常,最终导致应用崩溃。

已触发异常:FirebaseAuthException
([firebase_auth/invalid-credential] 提供的身份验证凭证不正确、格式错误或已过期。)

相关代码:

void signInWithEmail(String email, String password) async {
  state = state.copyWith(isLoading: true);
  try {
    UserCredential result = await _auth.signInWithEmailAndPassword(email: email.trim(), password: password.trim());
    state = state.copyWith(user: await _createMyUserFromFirebaseUser(result.user!), isLoading: false);
  } on FirebaseAuthException catch (e) {
    state = state.copyWith(isLoading: false, error: e.toString());
  } on PlatformException catch (_) {} catch (_) {}
}

以下是几个可尝试的解决方向:

  • 检查并升级firebase_auth依赖版本
    旧版本的firebase_auth可能存在异常抛出的bug,导致特定异常无法被正确捕获。打开pubspec.yaml,将firebase_auth更新到最新稳定版,然后执行flutter pub get同步依赖。

  • 确认FirebaseAuthException的导入正确性
    确保代码顶部已经导入了正确的包:

    import 'package:firebase_auth/firebase_auth.dart';
    

    如果导入错误,会导致catch块无法识别FirebaseAuthException类型,自然捕获不到对应异常。

  • 排查_createMyUserFromFirebaseUser方法的异常
    当前代码的try块中,除了signInWithEmailAndPassword,还调用了_createMyUserFromFirebaseUser方法。如果这个方法内部抛出了未被捕获的异常,也会导致应用崩溃,且不会被当前的FirebaseAuthExceptioncatch块捕获。
    可以修改代码,将_createMyUserFromFirebaseUser的调用纳入异常监控,或者在该方法内部处理异常:

    void signInWithEmail(String email, String password) async {
      state = state.copyWith(isLoading: true);
      try {
        UserCredential result = await _auth.signInWithEmailAndPassword(email: email.trim(), password: password.trim());
        final myUser = await _createMyUserFromFirebaseUser(result.user!);
        state = state.copyWith(user: myUser, isLoading: false);
      } on FirebaseAuthException catch (e) {
        state = state.copyWith(isLoading: false, error: e.toString());
      } on PlatformException catch (_) {
        state = state.copyWith(isLoading: false, error: "平台异常");
      } catch (e) {
        // 兜底捕获所有未处理的异常,避免崩溃
        state = state.copyWith(isLoading: false, error: "登录失败: ${e.toString()}");
      }
    }
    

    同时检查_createMyUserFromFirebaseUser方法内部是否有未处理的异步或同步异常。

  • 添加全局异常捕获用于排查
    可以先添加全局异常捕获来定位异常的具体来源,比如在main函数中:

    void main() {
      runZonedGuarded(() {
        runApp(MyApp());
      }, (error, stackTrace) {
        print("全局捕获异常: $error");
        print("堆栈信息: $stackTrace");
      });
    }
    

    这样可以明确异常是来自登录方法本身,还是后续的用户创建逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:04:56