使用电子邮件和密码创建帐户时,Flutter + Firebase updateDisplayName

时间:2019-02-15 22:34:41

标签: firebase login dart flutter firebase-authentication

我是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变量时,即使创建了用户并且我也可以打印电子邮件和密码,它也始终显示为null!

我想问题是Firebase user为空,但是即使我在print('USERNAME IS: ${user.displayName}');之后向右移动updateProfile,也会发生同样的情况。

希望你们能提供帮助! 谢谢。

3 个答案:

答案 0 :(得分:0)

您不应同时使用await,然后再使用。 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}');
}

答案 1 :(得分:0)

因此,对我有用的是:我必须调用reload()方法以在updateProfile()之后获取新的用户信息。进行一些更改后,方法如下所示:

  _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()}');
});
}

答案 2 :(得分:0)

如果有人还在搜索,这就是 2021 年可行的解决方案。

UserCredential userCred = await _auth.createUserWithEmailAndPassword(email, password);

await userCred.user.updateProfile(displayName: "Your Name");