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

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等多种方法,但已困扰数小时仍未解决。


问题分析

你的代码存在两个核心问题导致重复注册错误无法被正确捕获:

  1. then+catchError 与外层 try-catch 的冲突:你在await后链式调用了then和catchError,catchError会提前捕获createUserWithEmailAndPassword抛出的错误,导致外层try-catch无法感知到该错误。而catchError内仅调用了Fluttertoast,没有触发自定义Snackbar,也未处理未捕获错误引发的卡顿。
  2. 缺少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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:21:31