Firebase Auth Exception未被catch捕获,错误凭证登录致应用崩溃
当使用错误凭证登录时,系统会按预期抛出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

