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

createUserWithEmailAndPassword执行后后续代码未运行,仅whenComplete触发

问题分析与解决

问题描述

执行以下代码时,仅whenComplete中的日志输出,后续给globals.user赋值及日志代码均未运行:

UserCredential result = await fireAuth.createUserWithEmailAndPassword(email: email, password: password).whenComplete(() => debugPrint("CREATE USER COMPLETE"));

globals.user = result.user!;
debugPrint(globals.user);
debugPrint("+-+-+-+-+-+-+-+-+ result is $result");

原因

createUserWithEmailAndPassword创建用户失败时会抛出异常,await遇到异常会直接中断后续代码执行,但whenComplete的特性是无论Future成功或失败(进入完成状态)都会触发执行,所以会出现只有whenComplete日志输出的情况。常见失败原因包括:邮箱格式不合法、密码长度不足、邮箱已被注册、网络异常等。

解决方法

通过try-catch捕获异常,既能定位失败原因,也能避免代码中断:

try {
  UserCredential result = await fireAuth.createUserWithEmailAndPassword(
    email: email, 
    password: password
  );
  // 创建成功时执行以下逻辑
  globals.user = result.user!;
  debugPrint(globals.user.toString());
  debugPrint("+-+-+-+-+-+-+-+-+ result is $result");
} catch (e) {
  // 捕获并打印异常,排查失败原因
  debugPrint("创建用户失败: $e");
} finally {
  // 无论成功失败都执行的逻辑,替代原whenComplete
  debugPrint("CREATE USER COMPLETE");
}

也可以保留whenComplete,但必须配合异常捕获:

try {
  UserCredential result = await fireAuth.createUserWithEmailAndPassword(
    email: email, 
    password: password
  ).whenComplete(() => debugPrint("CREATE USER COMPLETE"));
  globals.user = result.user!;
  debugPrint(globals.user.toString());
  debugPrint("+-+-+-+-+-+-+-+-+ result is $result");
} catch (e) {
  debugPrint("创建用户失败: $e");
}

关键点提醒

  • 不要忽略Firebase Auth操作的异常,这些异常是排查问题的核心依据
  • whenComplete不处理异常,仅在Future完成时执行回调,异常仍会向上抛出
  • 直接用!访问result.user存在空安全风险,建议先判断result.user是否为null再赋值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:42:11