【问题标题】:Flutter - firebase_auth updateProfile method is not workingFlutter - firebase_auth updateProfile 方法不起作用
【发布时间】:2018-12-01 19:53:02
【问题描述】:

我正在使用 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");

    });
  }

这个方法是点击注册按钮时的句柄。

集合看起来像这张照片。

【问题讨论】:

  • 在上传之前检查 displayName 是否有值。有时 Google 用户没有设置名称。与 photoUrl 相同。

标签: firebase dart firebase-authentication google-cloud-firestore flutter


【解决方案1】:

如果我没记错的话,当您致电 updateDisplayNameupdatePhotoURL 时,本地用户配置文件不会立即更新。这意味着您应该将本地值写入数据库(最简单)或强制重新加载配置文件(最安全)。

写入局部值

如前所述,这是最简单的方法:

FirebaseFirestore.instance.collection('users').doc().set({
  'name': displayName,
  'uid': user.uid,
  'email': user.email,
  'isEmailVerified': user.emailVerified, // will also be false
  'photoUrl': user.photoURL, // will always be null
});

请注意,emailVerified 将始终为 false,photoUrl 在新创建的电子邮件+密码帐户中将始终为 null

强制重新加载配置文件

您可以通过调用FirebaseUser.reload() 来强制重新加载用户数据:

await _auth.currentUser!.updateDisplayName(displayName);
await _auth.currentUser!.updateEmail(newEmail);
await _auth.currentUser!.updatePhotoURL(photoURL);
await _auth.currentUser!.reload();

user = _auth.currentUser;

【讨论】:

  • 我认为使用 Local Veriable 非常适合选择更新......
【解决方案2】:

要更新用户显示名称和照片网址,这肯定会有所帮助。

  FirebaseUser user = await FirebaseAuth.instance.currentUser();

  UserUpdateInfo userUpdateInfo = new UserUpdateInfo();
  userUpdateInfo.displayName = name;
  userUpdateInfo.photoUrl = url;

  user.updateProfile(userUpdateInfo);

【讨论】:

    【解决方案3】:

    Firebase Auth 的工作方式很不方便,他们说它现在不会改变,所以我制作了一个包来解决这个问题,在这里获取它:firebase_user_stream

    在自述文件中,我解释了问题以及软件包如何解决这些问题,还有示例等等,享受吧!

    编辑(2020 年 7 月):

    Firebase Auth for Flutter 现在有一个userChanges 流:

    每当身份验证状态、id 令牌或配置文件发生更改时触发。本质上,这是一种获取当前无状态功能(例如 updateProfile)的实时更改的方式。

    【讨论】:

    • 感谢您发布此内容,但我搜索并似乎找不到文档中任何地方引用的 userChanges steam。如何找到找到 userChanges 流的位置?
    • 我认为它还没有在 stable 分支上发布,它是一个仍处于测试阶段的功能。一旦它稳定了,我会在我的包中添加一个关于这个的注释。
    • 谢谢@michel-feinstein,你真棒。
    【解决方案4】:

    我也尝试了所有方法,但是,这对我有用!只需像代码中那样调用 FirebaseAuth.instance 两次即可。

          FirebaseUser currentUser = await _auth.currentUser();
          await currentUser.reload();
          currentUser = await _auth.currentUser();
    
          print("Current User   ${currentUser.displayName}");
          print("Current User   ${currentUser.photoUrl}");

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 2019-02-14
      • 2016-11-28
      • 2020-10-07
      • 1970-01-01
      • 2022-01-03
      • 2018-05-28
      • 2018-12-02
      • 1970-01-01
      相关资源
      最近更新 更多