Flutter Firebase注册报错:返回null与UserCredential类型不匹配求助
解决Flutter Firebase注册时的FutureOr非空报错问题
你的报错核心原因是:await 后面的 .then() 回调没有返回 UserCredential 对象,导致 await 表达式最终返回 null,但你把它赋值给了非空类型的 UserCredential 变量,触发了Dart空安全检查错误。
下面给两种修改方案,选一种即可:
方案一:纯async/await写法(推荐,代码更易读)
拆分异步操作,不要混合await和.then(),逻辑更清晰:
void validateAndSubmit() async { if (validateAndSave()) { try { // 先获取注册后的UserCredential UserCredential userCredential = await FirebaseAuth.instance .createUserWithEmailAndPassword(email: _email, password: _password); // 确保用户对象非空后,写入Firestore if (userCredential.user != null) { await FirebaseFirestore.instance.collection('users').doc(userCredential.user!.uid).set({ "uid": userCredential.user!.uid, 'Name': _name, 'userName': _userName, 'email': _email, }); } Navigator.pushNamed(context, '/home'); print('Registered user: ${userCredential.user}'); const snackBar = SnackBar(content: Text('User has been successfully registered!')); ScaffoldMessenger.of(context).showSnackBar(snackBar); } on FirebaseAuthException catch (e) { print('Auth Error: $e'); } catch (e) { // 捕获Firestore写入等其他异常 print('Data Write Error: $e'); } } }
方案二:保留then但返回UserCredential
如果一定要用.then(),必须在回调里返回userCredential,让await能拿到正确的非空值:
void validateAndSubmit() async { if (validateAndSave()) { try { UserCredential userCredential = await FirebaseAuth.instance .createUserWithEmailAndPassword(email: _email, password: _password) .then((userCredential) { // 写入Firestore后,返回原userCredential对象 FirebaseFirestore.instance.collection('users').doc(userCredential.user!.uid).set({ "uid": userCredential.user!.uid, 'Name': _name, 'userName': _userName, 'email': _email, }); return userCredential; // 关键:必须返回这个对象 }); Navigator.pushNamed(context, '/home'); print('Registered user: ${userCredential.user}'); const snackBar = SnackBar(content: Text('User has been successfully registered!')); ScaffoldMessenger.of(context).showSnackBar(snackBar); } on FirebaseAuthException catch (e) { print('Error: $e'); } } }
额外提示
- 方案一中添加了
userCredential.user != null的判断,避免极端情况下的空指针错误; - 给Firestore写入操作加
await,确保数据写入完成后再跳转页面,避免用户进入首页后看不到自己的信息; - 可以在catch块里添加错误提示的SnackBar,让用户直观知道注册失败的原因。
内容的提问来源于stack exchange,提问作者Anesu Mazvimavi
相关产品推荐
相关产品推荐

