Future.catchError错误处理异常:重复注册邮箱未捕获错误致应用卡顿
解决重复注册时错误未捕获导致应用卡顿的问题
我需要在用户操作出错时显示带错误信息的Snackbar,新用户注册时功能正常,但用已注册邮箱重复注册时,错误未被捕获,应用卡顿。以下是我的代码:
void signUp(String email, String password) async { if (_formKey.currentState!.validate()) { try { await _auth .createUserWithEmailAndPassword(email: email, password: password) .then((value) => {postDetailsToFirestore()}) .catchError((e) { Fluttertoast.showToast(msg: e!.message); }); } on FirebaseAuthException catch (error) { switch (error.code) { case "invalid-email": errorMessage = "Your email address appears to be malformed."; break; case "wrong-password": errorMessage = "Your password is wrong."; break; case "user-not-found": errorMessage = "User with this email doesn't exist."; break; case "user-disabled": errorMessage = "User with this email has been disabled."; break; case "too-many-requests": errorMessage = "Too many requests"; break; case "operation-not-allowed": errorMessage = "Signing in with Email and Password is not enabled."; break; default: errorMessage = "An undefined Error happened."; } // default snackbar Fluttertoast.showToast(msg: errorMessage!); print(error.code); // custom snackbar ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar(getSnack( errorMessage!, ContentType.failure, 'Failed !')); } } }
我尝试了返回Future、调整代码格式、使用onError替代catchError等多种方法,但已困扰数小时仍未解决。
问题分析
你的代码存在两个核心问题导致重复注册错误无法被正确捕获:
then+catchError与外层try-catch的冲突:你在await后链式调用了then和catchError,catchError会提前捕获createUserWithEmailAndPassword抛出的错误,导致外层try-catch无法感知到该错误。而catchError内仅调用了Fluttertoast,没有触发自定义Snackbar,也未处理未捕获错误引发的卡顿。- 缺少
email-already-in-use错误分支:重复注册时Firebase抛出的错误码是email-already-in-use,但你的switch语句未覆盖该分支,即便错误被捕获,也只会显示默认的模糊错误信息。
解决方案
修改代码,移除then和catchError,统一用try-catch处理所有异常,并添加email-already-in-use的专属处理分支:
void signUp(String email, String password) async { if (_formKey.currentState!.validate()) { try { // 直接await调用,去掉then和catchError UserCredential userCredential = await _auth.createUserWithEmailAndPassword( email: email, password: password, ); // 用户创建成功后执行后续逻辑 postDetailsToFirestore(); } on FirebaseAuthException catch (error) { String errorMessage; switch (error.code) { case "invalid-email": errorMessage = "Your email address appears to be malformed."; break; case "wrong-password": errorMessage = "Your password is wrong."; break; case "user-not-found": errorMessage = "User with this email doesn't exist."; break; case "user-disabled": errorMessage = "User with this email has been disabled."; break; case "too-many-requests": errorMessage = "Too many requests"; break; case "operation-not-allowed": errorMessage = "Signing in with Email and Password is not enabled."; break; case "email-already-in-use": // 新增重复注册错误处理 errorMessage = "This email is already registered, please use another one."; break; default: errorMessage = "An undefined Error happened."; } // 统一触发提示 Fluttertoast.showToast(msg: errorMessage); print(error.code); ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar(getSnack(errorMessage, ContentType.failure, 'Failed !')); } catch (e) { // 捕获非FirebaseAuth类型的异常,避免卡顿 Fluttertoast.showToast(msg: "Operation failed, please try again later."); ScaffoldMessenger.of(context) ..hideCurrentSnackBar() ..showSnackBar(getSnack("Operation failed, please try again later.", ContentType.failure, 'Failed !')); } } }
关键改动说明
- 移除
then和catchError,让所有异常直接进入外层try-catch处理,确保错误不会被“吃掉”。 - 添加
email-already-in-use分支,精准处理重复注册场景的错误提示。 - 新增通用
catch块,兜底处理所有非FirebaseAuth异常,彻底避免未捕获错误导致的应用卡顿。
内容的提问来源于stack exchange,提问作者Waseem Raza
相关产品推荐
相关产品推荐

