Flutter Firebase注册时保存displayName失败,SnackBar返回null求助
解决Firebase Auth注册时displayName为null的问题
嘿,我一眼就看到问题出在哪了——你已经准备好要更新用户的displayName,但漏掉了最关键的一步:把更新提交到Firebase服务器!
你创建了UserUpdateInfo对象并设置了displayName,但没有调用user.updateProfile(userUpdateInfo)方法。这就好比你填好了表单,但没点提交按钮,服务器根本不知道你要更新这个信息。直接调用user.reload()只是从服务器重新拉取数据,但服务器上的displayName还是空的,所以自然返回null。
这里是修正后的完整代码,我标注了关键改动点:
Future<void> signUp() async { try { FirebaseUser user = (await FirebaseAuth.instance .createUserWithEmailAndPassword( email: email.text, password: password.text)) .user; // 准备用户更新信息 UserUpdateInfo userUpdateInfo = UserUpdateInfo(); userUpdateInfo.displayName = name.text; // 🔑 关键步骤:提交更新到Firebase Auth服务器 await user.updateProfile(userUpdateInfo); // 重新加载用户数据,确保拿到最新状态 await user.reload(); // 注意:reload后需要重新获取用户实例,原对象不会自动更新 user = await FirebaseAuth.instance.currentUser(); showInSnackBar("User name ${user.displayName}"); try { await user.sendEmailVerification(); showInSnackBar("Email verification sent"); } catch (e) { print(e); } } catch (e) { String errorCode = e.code; print(e); if (errorCode == "ERROR_EMAIL_ALREADY_IN_USE") { showInSnackBar("This email is already in use"); } else { showInSnackBar("Something went wrong! Try again later"); } } }
另外还有两个小细节提醒你:
- 调用
reload()之后,一定要重新获取currentUser(),因为原来的user对象实例不会自动同步服务器的最新数据。 - 你代码里有个拼写错误
Somthing,我已经改成正确的Something了。
这样修改后,你的SnackBar应该就能正确显示用户的displayName了!
内容的提问来源于stack exchange,提问作者Pranav
相关产品推荐
相关产品推荐

