Flutter - firebase_auth updateProfile 方法不起作用

Posted

技术标签:

【中文标题】Flutter - firebase_auth updateProfile 方法不起作用【英文标题】:Flutter - firebase_auth updateProfile method is not working 【发布时间】: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 相同。 【参考方案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");

希望对你有帮助!

【讨论】:

以上是关于Flutter - firebase_auth updateProfile 方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 cloud_firestore 和 firebase_auth 兼容性问题

MissingPluginException(在通道 plugins.flutter.io/firebase_auth 上找不到方法 signInWithCredential 的实现)

Flutter - firebase_auth updateProfile 方法不起作用

Flutter 版本解决失败 firebase_auth ^1.4.1 和 http ^0.12.2

Flutter firebase_auth signInWithCredential 在android上不起作用

Flutter:StreamBuilder 快照——无数据