Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flatter中FirebaseUser的reload()函数在哪个用例中使用?_Firebase_Dart_Firebase Authentication_Flutter - Fatal编程技术网

Flatter中FirebaseUser的reload()函数在哪个用例中使用?

Flatter中FirebaseUser的reload()函数在哪个用例中使用?,firebase,dart,firebase-authentication,flutter,Firebase,Dart,Firebase Authentication,Flutter,FirebaseUser的.reload()方法用于什么? 在本地,该函数不会更改任何数据,使用Firestore.instance.currentUser()我将始终获得当前数据,不是吗 从文档中: 公共任务重新加载() 手动刷新当前用户的数据(例如,附加的提供程序、显示名称等) 因此,我最初认为在调用user.reload()之后,输出应该是:“用户名:bar”,而不是“用户名:foo”所以对我来说它似乎什么都没做? 相关附带问题: 这也意味着我必须始终调用FirebaseAuth.inst

FirebaseUser的.reload()方法用于什么?
在本地,该函数不会更改任何数据,使用Firestore.instance.currentUser()我将始终获得当前数据,不是吗

从文档中:

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

因此,我最初认为在调用user.reload()之后,输出应该是:“用户名:bar”,而不是“用户名:foo”所以对我来说它似乎什么都没做?

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

例如:

控制台输出:

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
调用
User.reload()
从服务器重新加载该用户的配置文件数据


这方面的一个典型用例是。当用户单击该电子邮件中的链接时,它将返回Firebase身份验证服务器,该服务器将其电子邮件地址标记为已验证。但当这种情况发生时,你的应用程序无法知道,因为电话直接从电子邮件客户端传到服务器。通常,你会在链接中添加一个所谓的链接,在验证电子邮件地址后,该链接可以回拨到你的应用程序中。然后,您的应用程序可以调用
reload()
从服务器加载更新的状态。

允许您在不注销的情况下验证电子邮件,然后再次登录。但这可能是一个bug,但当您调用user.reload()时,必须再次调用currentUser()

这不起作用:

await user.reload();
user.isEmailVerified => still false
您需要:

await user.reload();
user = await _auth.currentUser();
user.isEmailVerified => now it is true

这不是一个bug,但Firebase Auth的工作方式很奇怪,他们说现在不会改变,所以我制作了一个包来修复这个问题,在这里抓住它:


在自述文件中,我解释了这些问题以及软件包是如何解决这些问题的,还有一些例子等等,请欣赏

可能您需要使用。然后或完成时,以获取最新内容,例如:

await _auth.updateProfile().then((retornedValueFromTheMethod) {
  print(retornedValueFromTheMethod);
}).whenComplete(() {
  print("TODO something if you want");
});

您需要updateProfile是
未来的updateProfile(){…}

这似乎是预期的行为

就像已经说过的那样,只调用
.reload
不起作用

wait user.reload();
打印(user.emailVerified)//false
相反,您还必须再次获取
currentUser

wait user.reload();
//自FirebaseAuth返工以来,`currentUser`是同步的
user=firebaseAuth.currentUser;
打印(user.emailVerified)//true
通过返工(
firebase\u auth:^0.18.0
FirebaseAuth
也会公开
.userChanges()
-流。 这似乎是首选的解决方案,而不是手动重新加载用户信息

FirebaseAuth.userChanges()
的文档中:

这是[authStateChanges]和[idTokenChanges]的超集。信息技术 提供有关所有用户更改的事件,例如当凭据 链接、取消链接以及对用户配置文件进行更新时。这个 此流的目的是用于侦听对的实时更新 用户无需手动调用[reload],然后重新水化 对应用程序的更改

这还包括
.isEmailVerified
afaik(编辑:可能不正确,请参阅注释)

firebaseAuth.userChanges().listen((用户){
//你的逻辑
});

下面回答
reload()
应该如何工作。我不知道为什么在你的情况下,第二次打印仍然显示旧用户名。我希望其他人能在那里发现问题。所以我的理论应该是正确的,但是实现可能是错误的。谢谢你的解释。好的,
user.reload()
用于更新易于更改的用户数据,例如
displayName
photoUrl
isEmailVerified
,等等,并且仅此而已,因为其他数据,例如
uid
是常量?因此,这比仅仅获得一个新用户要好,因为这样可以稍微节省带宽?因为在您的示例中,也可以只请求
currentUser()
而不调用
reload()
,对吗?如果用户已经登录,请求
auth.currentUser()
不会从服务器刷新他们的配置文件数据。啊,好的,我不知道,谢谢。但是为什么在我的例子中它看起来是这样工作的呢??我的意思是,如果
auth.currentUser()
没有刷新配置文件数据,那么FirebaseAuth.instance.currentUser:的第一个
名称应该是“foo”而不是“bar”,因为我还没有调用
user.reload()
,不是吗?这对我来说非常有效。当我验证电子邮件时,userChanges()不会触发。但是,user.reload()返回emailVerified=true。@bounxye对我来说是一样的。我必须使用user.reload()可能我们做错了什么?等待,然后在一个表达式中完成-不是一个好主意auser=\u auth.currentUser;为我工作。谢谢
await _auth.updateProfile().then((retornedValueFromTheMethod) {
  print(retornedValueFromTheMethod);
}).whenComplete(() {
  print("TODO something if you want");
});