我正在使用Flutter和Firebase创建应用程序。我有一些奇怪的问题。我正在创建身份验证,并且工作正常,但是当我尝试向Firestore数据库中添加一些集合时,displayName的记录设置为null。
Future<FirebaseUser> createUser(email, password, displayName) async {
final FirebaseUser user = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
UserUpdateInfo info = new UserUpdateInfo();
info.displayName = displayName;
_auth.updateProfile(info);
Firestore.instance.collection('users').document().setData({
'name': user.displayName,
'uid': user.uid,
'email': user.email,
'isEmailVerified': user.isEmailVerified,
'photoUrl': user.photoUrl,
});
return user;
}
这是创建用户的Future类。
void _handleSubmitted() {
userAuth
.createUser(
emailController.text, passwordController.text, nameController.text)
.then((onValue) {
print("Sign Up button clicked: $onValue");
});
}
此方法是单击“注册”按钮时的句柄。
集合看起来像这张照片。
答案 0 :(得分:4)
如果我没记错的话,当您致电updateProfile
时,本地用户配置文件不会立即更新。这意味着您应该只将本地值写入数据库(最简单),或者强制重新加载概要文件(最安全)。
如上所述,这是最简单的方法:
Firestore.instance.collection('users').document().setData({
'name': displayName,
'uid': user.uid,
'email': user.email,
'isEmailVerified': user.isEmailVerified, // will also be false
'photoUrl': user.photoUrl, // will always be null
});
请注意,在新创建的电子邮件和密码帐户中,isEmailVerified
始终为假,photoUrl
始终为null
。
您可以通过调用FirebaseUser.reload()来强制重新加载用户数据:
_auth.updateProfile(info);
await user.reload();
user = _auth.getCurrentUser();
答案 1 :(得分:4)
Firebase Auth的工作方式很不方便,他们说它暂时不会更改,因此我制作了一个程序包来解决此问题,请在此处获取:firebase_user_stream
在自述文件中,我解释了这些问题以及软件包如何解决它们,还有示例等,请尽情享受!
编辑(2020年7月):
Flutter的Firebase Auth现在具有userChanges
流:
会在身份验证状态,ID令牌或配置文件发生更改时触发。本质上,这是一种获取当前无状态功能(例如updateProfile)的实时更改的方法。
答案 2 :(得分:1)
我也尝试了所有方法,但是,这对我有用!只需像代码中的两次调用FirebaseAuth.instance即可。
FirebaseUser currentUser = await _auth.currentUser();
await currentUser.reload();
currentUser = await _auth.currentUser();
print("Current User ${currentUser.displayName}");
print("Current User ${currentUser.photoUrl}");
希望这对您有帮助!
答案 3 :(得分:0)
要更新用户的显示名称和照片网址,这肯定会有所帮助。
FirebaseUser user = await FirebaseAuth.instance.currentUser();
UserUpdateInfo userUpdateInfo = new UserUpdateInfo();
userUpdateInfo.displayName = name;
userUpdateInfo.photoUrl = url;
user.updateProfile(userUpdateInfo);