使用电子邮件和密码创建帐户时,Flutter + Firebase updateDisplayName
Flutter + Firebase updateDisplayName when creating account with Email and Password
我是 Flutter 的新手,也是 firebase 的新手。
我正在尝试通过 createUserWithEmailAndPasswordMethod 创建用户。
我已成功创建,但我试图通过允许用户输入所需的用户名并将所述用户名设置为 displayName 属性来改进它。
我的代码如下:
_createUser() async {
UserUpdateInfo updateInfo = UserUpdateInfo();
updateInfo.displayName = _usernameController.text;
FirebaseUser user = await _auth
.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
)
.then((user) {
user.updateProfile(updateInfo);
});
print('USERNAME IS: ${user.displayName}');
}
问题是当我 运行 应用程序时它总是抛出这个异常:
NoSuchMethodError: The getter 'displayName' was called on null.
每次我调试 user
变量也一直显示为空,即使用户已创建并且我可以打印电子邮件和密码!
我想问题是 Firebase user
为空,但即使我将 print('USERNAME IS: ${user.displayName}');
移到 updateProfile
之后,也会发生同样的情况。
希望大家帮帮忙!
谢谢。
你不应该同时使用 await 和 then 。 await 是 then 方法的替代方法。
_createUser() async {
await _auth
.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
)
FirebaseUser user = await _auth.currentUser();
UserUpdateInfo updateInfo = UserUpdateInfo();
updateInfo.displayName = _usernameController.text;
user.updateProfile(updateInfo);
print('USERNAME IS: ${user.displayName}');
}
所以,对我有用的是:我必须在 updateProfile() 之后调用 reload() 方法来获取新的用户信息。经过一些更改后,该方法如下所示:
_createUser() async {
UserUpdateInfo updateInfo = UserUpdateInfo();
updateInfo.displayName = _usernameController.text;
await _auth
.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
)
.then((user) async {
await user.updateProfile(updateInfo);
await user.reload();
FirebaseUser updatedUser = await _auth.currentUser();
print('USERNAME IS: ${updatedUser.displayName}');
Navigator.of(context).push(
MaterialPageRoute<Map>(
builder: (BuildContext context) {
return Posts(_googleSignIn, updatedUser);
},
),
);
}).catchError((error) {
print('Something Went Wrong: ${error.toString()}');
});
}
如果有人仍在搜索,这是 2021 年的工作解决方案。
UserCredential userCred = await _auth.createUserWithEmailAndPassword(email, password);
await userCred.user.updateProfile(displayName: "Your Name");
我是 Flutter 的新手,也是 firebase 的新手。
我正在尝试通过 createUserWithEmailAndPasswordMethod 创建用户。 我已成功创建,但我试图通过允许用户输入所需的用户名并将所述用户名设置为 displayName 属性来改进它。
我的代码如下:
_createUser() async {
UserUpdateInfo updateInfo = UserUpdateInfo();
updateInfo.displayName = _usernameController.text;
FirebaseUser user = await _auth
.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
)
.then((user) {
user.updateProfile(updateInfo);
});
print('USERNAME IS: ${user.displayName}');
}
问题是当我 运行 应用程序时它总是抛出这个异常:
NoSuchMethodError: The getter 'displayName' was called on null.
每次我调试 user
变量也一直显示为空,即使用户已创建并且我可以打印电子邮件和密码!
我想问题是 Firebase user
为空,但即使我将 print('USERNAME IS: ${user.displayName}');
移到 updateProfile
之后,也会发生同样的情况。
希望大家帮帮忙! 谢谢。
你不应该同时使用 await 和 then 。 await 是 then 方法的替代方法。
_createUser() async {
await _auth
.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
)
FirebaseUser user = await _auth.currentUser();
UserUpdateInfo updateInfo = UserUpdateInfo();
updateInfo.displayName = _usernameController.text;
user.updateProfile(updateInfo);
print('USERNAME IS: ${user.displayName}');
}
所以,对我有用的是:我必须在 updateProfile() 之后调用 reload() 方法来获取新的用户信息。经过一些更改后,该方法如下所示:
_createUser() async {
UserUpdateInfo updateInfo = UserUpdateInfo();
updateInfo.displayName = _usernameController.text;
await _auth
.createUserWithEmailAndPassword(
email: _emailController.text,
password: _passwordController.text,
)
.then((user) async {
await user.updateProfile(updateInfo);
await user.reload();
FirebaseUser updatedUser = await _auth.currentUser();
print('USERNAME IS: ${updatedUser.displayName}');
Navigator.of(context).push(
MaterialPageRoute<Map>(
builder: (BuildContext context) {
return Posts(_googleSignIn, updatedUser);
},
),
);
}).catchError((error) {
print('Something Went Wrong: ${error.toString()}');
});
}
如果有人仍在搜索,这是 2021 年的工作解决方案。
UserCredential userCred = await _auth.createUserWithEmailAndPassword(email, password);
await userCred.user.updateProfile(displayName: "Your Name");