Firebase登录user-not-found PlatformException的处理与崩溃规避
Firebase登录异常崩溃修复方案
崩溃根因
现有代码的异常捕获范围和实际抛出的异常类型不匹配:代码中仅捕获FirebaseException类型异常,但本次登录触发的是原生桥接层抛出的PlatformException——两类异常是平级关系,不存在继承关联,因此异常没有被catch块拦截,直接穿透到外层触发未捕获异常,最终导致应用崩溃。
修正后的实现逻辑
调整捕获逻辑覆盖两类常见异常类型,同时精准匹配user-not-found错误码,触发对应平台的提示弹窗,不会再出现未捕获崩溃:
Future<void> submit( context, FirebaseAuth authF, String email, String password ) async { try { final userCredential = await authF.signInWithEmailAndPassword( email: email, password: password, ); // 登录成功后的跳转、状态更新逻辑 return; } // 捕获原生桥接层抛出的未封装异常 on PlatformException catch (e) { // 匹配用户不存在的错误码 if (e.code == 'user-not-found') { if (Platform.isIOS) { LogInCupertinoDialogue(context); } else { LogInAndroidDialogue(context); } } // 可扩展其他常见登录异常分支,如密码错误、账号被禁用等 else if (e.code == 'wrong-password') { if (Platform.isIOS) { LogInCupertinoDialogue(context); } else { LogInAndroidDialogue(context); } } return; } // 兼容新版firebase_auth封装抛出的标准FirebaseException on FirebaseException catch (e) { if (e.code == 'user-not-found') { if (Platform.isIOS) { LogInCupertinoDialogue(context); } else { LogInAndroidDialogue(context); } } return; } // 兜底捕获所有未预料的异常,从根源避免无捕获崩溃 catch (e) { if (Platform.isIOS) { LogInCupertinoDialogue(context); } else { LogInAndroidDialogue(context); } return; } }
优化注意事项
- 捕获块的排序要遵循“从具体到泛化”的规则,先匹配特定异常类型,最后再做通用兜底,避免漏捕特定场景的异常
- 如果需要针对不同异常展示差异化提示,可以给自定义的弹窗组件预留文案参数位,把对应错误码的提示语统一透传,减少重复逻辑
- 双异常类型捕获是为了适配不同版本
firebase_auth插件的行为差异:旧版本插件大多直接透传原生层的PlatformException,新版本会将其封装为标准FirebaseException,保留两类捕获块可以实现全版本兼容
内容的提问来源于stack exchange,提问作者federico D'Armini
相关产品推荐
相关产品推荐

