方法是什么.从用于的FirebaseUser重新加载()

从文档中:

公共任务重新加载() 手动刷新当前用户的数据(例如,附着的提供程序、显示名称等).

所以我最初认为在调用user.reload()之后,输出应该是:"name of user:bar",而不是"name of user:foo".So for me it seems like it doesn't really do anything?

Related side-question:
这也意味着我必须始终调用FirebaseAuth.instance.currentUser()以确保获得用户的最新信息?没有办法有一个FirebaseUser流,当用户信息更改时,它会发出一个新的FirebaseUser?(我指的不是Firebase.instance.onAuthStateChanged())

例子:

 static stackOverflowProblem() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    print("Name of User: ${user.displayName}"); //prints foo

    //Renaming the name from "foo" to "bar"
    UserUpdateInfo userInfo = UserUpdateInfo();
    userInfo.displayName = "bar";
    await _auth.updateProfile(userInfo);

    print("\nBefore calling user.reload:");
    print("Name of user: ${user.displayName}"); //prints foo
    print("Name of FirebaseAuth.instance.currentUser: ${(await FirebaseAuth.instance.currentUser()).displayName}"); //prints bar

    await user.reload();

    print("\nAfter calling user.reload:");
    print("Name of user: ${user.displayName}"); //prints foo
    print("Name of FirebaseAuth.instance.currentUser: ${(await FirebaseAuth.instance.currentUser()).displayName}"); //prints bar
  }

控制台输出:

I/flutter (19989): Name of User: Foo
I/flutter (19989): 
I/flutter (19989): Before calling user.reload:
I/flutter (19989): Name of user: Foo
I/flutter (19989): Name of FirebaseAuth.instance.currentUser: bar
I/flutter (19989): 
I/flutter (19989): After calling user.reload:
I/flutter (19989): Name of user: Foo
I/flutter (19989): Name of FirebaseAuth.instance.currentUser: bar

推荐答案

这似乎是有意为之的行为.

就像已经说过的那样,只拨打.reload是行不通的.

await user.reload();
print(user.emailVerified) // false

取而代之的是,你还必须再次拿到currentUser分.

await user.reload();
// `currentUser` is synchronous since FirebaseAuth rework
user = firebaseAuth.currentUser;
print(user.emailVerified) // true

对于返工(firebase_auth: ^0.18.0),FirebaseAuth也expose 了.userChanges()流. 这似乎是首选的解决方案,而不是手动重新加载用户信息.

FirebaseAuth.userChanges()份文件中:

这是[authStateChanges]和[idTokenChanges]的超集.它 提供有关所有用户更改的事件,例如当凭据 已链接、未链接以及何时更新用户配置文件.这个 此流的目的是用于监听对 用户无需手动调用[Reload]然后重新消重 更改您的应用程序.

这也包括.isEmailVerified个AFAIK(EDIT:可能不是真的,请参阅注释).

firebaseAuth.userChanges().listen((user) {
  // Your logic
});

Dart相关问答推荐

S,返回Future.sync()的函数和不需要等待的异步函数有什么区别?

空值判断运算符 - Flutter

如何在 Dart 2.17+ 中处理future 的枚举值

NetworkImage 正在缓存旧图像

Flutter/Dart 为 Google Maps Marker 添加自定义点击事件

Flutter:如何同步使用 SharedPreferences?

Flutter:[cloud_firestore/unknown] NoSuchMethodError:null 上的无效成员:'includeMetadataChanges'(Flutter Web)

如何在 Flutter 的小部件树中将新的 MaterialPageRoute 作为子项打开

Flutter 屏幕尺寸计算

如何在flatter中使用SQFlite更新数据库表

flatter:如何使用JSON数据创建数组

更新复选框并从Flutter对话框中返回值

在 Dart 中使用带有 Future 的循环

如何在Dart中switch 枚举?

如何循环遍历元素列表

用默认值初始化成员的最优雅的方法

Dart 会支持服务器端开发吗?

Dart 是否支持函数式编程?

如何通过 Dart 中的值获取 Map 键?

Dart 中如何将列表转换为map