Dart空安全迁移后Firebase注册接口类型不匹配报错修复
故障原因
空安全模式下Dart的运行时类型校验会严格匹配泛型与函数返回值类型,你遇到的报错来自三个核心问题:
then方法的回调函数不符合类型要求:createUserWithEmailAndPassword返回Future<UserCredential>,对应的then回调签名要求是(UserCredential) => FutureOr<UserCredential>,但你写的回调里没有返回任何值,无返回值的async函数默认返回Future<Null>,和要求的类型完全不匹配。- 你写的强制类型转换是无效转换:你把转换逻辑写在了函数体末尾,没有改变回调函数本身的返回值类型,运行时做类型校验时依然会判定类型不匹配。
- 注册流程看起来能正常执行是因为账号创建、用户数据写入的逻辑确实跑完了,但执行到给
credential变量赋值的步骤时,拿不到符合类型要求的UserCredential返回值,就会抛出类型异常,后续的发验证邮件等逻辑不会正常执行。
修复代码
最稳妥的方案是不要混用await和then,空安全下全用await串行调用可以规避绝大多数类型问题,同时补上你漏掉的_userServices.createUser的await等待,避免数据写入未完成就执行后续逻辑。
直接替换signUpUser方法中对应出错的代码段即可:
try { UserCredential credential = await FirebaseAuth.instanceFor(app: secondaryApp) .createUserWithEmailAndPassword(email: email, password: password); // 拿到凭证后写入用户数据,必须加await等待写入完成 await _userServices.createUser( uid: credential.user!.uid, username: username, email: email, firstName: firstName, lastName: lastName, birthday: birthday, gender: gender, status: 'aktiv', role: 'User', ); if (credential.user == null) { throw 'An error occured. Please try again.'; } await credential.user!.sendEmailVerification(); } on FirebaseAuthException catch (e) { print(e); }
替换后不需要写任何强制类型转换,类型完全符合空安全要求,不会再抛出该类型错误。
附带逻辑问题修正
你提供的注册页代码里还有两个空安全迁移后遗留的问题,建议一并修复:
- 所有类似
usernameController.text.trim() != null的判断都是无效判断:空安全下TextEditingController.text的类型是非空String,永远不可能返回null,这些冗余判断可以直接删除。 - 用户名重复判断的分支逻辑写反了:当前代码在
mapUsernameExist!.isEmpty(用户名不存在)的分支里判断邮箱状态、提示用户名占用,会导致正常的未注册用户走到错误提示分支,需要把判断条件调整为mapUsernameExist!.isNotEmpty时触发用户名已占用的提示。
内容的提问来源于stack exchange,提问作者Hans Sama
相关产品推荐
相关产品推荐

