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
相关产品推荐
相关产品推荐

