我有一个使用Firebase身份验证和邮箱/密码身份验证的Ffltter应用程序.

APP正在使用main.dart中的StreamProvider来获得用户.

  StreamProvider<UserModel?>.value(
                  initialData: null,
                  catchError: (_, op) => null,
                  value: AuthService().user,
                ),

稍后我调用这个方法来获取用户信息:

User? getCurrentUser() {
    return _auth.currentUser;
  }

这是伟大的工作,我可以登录,注销,注册,处理忘记的密码.但邮箱验证存在一个问题.

当用户第一次注册时,正如预期的那样,值为emailVerified为假.

我使用以下方法发送验证邮件:

await user.sendEmailVerification();

但是,在用户验证邮箱后,这不会反映在用户对象中.即使关闭应用程序并重新启动,emailVerified的值仍然是false.

只有在我注销并再次登录后,此选项才会刷新.

由于重启应用程序没有任何帮助,我可以假设出问题的不是我的代码.用户似乎被缓存了,而不是被Ffltter或Firebase刷新.

我想我可能不得不使用reload方法,但我想要一些关于这方面的指导.

用户更改不可见并需要重新加载是否正常? 我什么时候需要重新装货?每次应用程序启动时? 我是否只对未通过邮箱验证的帐户执行此操作,或者是否有其他我可能错过的更新?

推荐答案

在Firebase身份验证中,用户信息最初是在用户登录或应用程序启动时检索的,并且不会自动实时更新.因此,如果您在当前会话之外执行操作(如邮箱验证),则在显式刷新之前,您可能看不到更新的用户信息.

Firebase身份验证中的ReLoad方法用于刷新用户数据,包括emailVerify属性.您可以调用此方法以强制使用来自服务器的最新信息更新用户对象.

下面是一个如何使用reload方法的示例:

Future<void> reloadUser() async {
  User? user = _auth.currentUser;
  await user?.reload();
  user = _auth.currentUser; // Get the refreshed user object
  // Now, user.emailVerified should reflect the latest status
}

您可以在需要确保用户信息(包括emailVerified状态)是最新的时候调用此方法.这可能是必要的,如邮箱验证后的行动.

至于何时调用reload方法,这取决于您的应用的需求.您可能需要考虑在以下情况下调用它:

  1. 在用户执行可能会更改其 身份验证状态,如邮箱验证.
  2. 当应用程序 启动或继续以确保用户的信息是最新的.在……里面 对特定用户交互的响应,例如,当用户 导航到配置文件页面.请记住,调用RELOAD可以 涉及网络请求,因此您应该考虑用户 体验和性能影响取决于您的特定 用例.
  3. 总而言之,用户更改不是正常行为 自动反映在User对象中,并且您需要使用 方法以在需要时手动更新它.

调用ReLoad的频率取决于您的应用程序的要求和您希望确保用户信息最新的特定场景.

Flutter相关问答推荐

如何更改默认应用程序启动器/启动屏幕

CMakeLists.txt处的CMake错误:3(项目)找不到指定的Visual Studio实例

如何确定Flutter 中的文本 colored颜色 ?

使用持久的侧边菜单和顶部栏在Ffltter Web应用程序中的页面之间导航

如何在Flutter 安全存储器中存储对象值?

如何在Flutter中制作弯曲文本

如何使用providerContainer监听/写入FutureProvider?

尽管我的 url 链接正确,但 ArgumentError(无效参数:URI 文件中未指定主机:///)错误

如何从Firebase登录获取用户信息,如电话号码、出生日期和性别

在 Flutter 中更改喜欢按钮的 colored颜色

FutureProvider 不返回数据给 UI

Dart 撕掉 const 构造函数

Elevated 和 Outlined 按钮之间的动画

转换函数上传文件上传Uint8List

如何与 PostgreSQL 和外部网站交互 flutter apk?

如何建立最近的文件列表?

statefulWidget 无法进行所需更改的问题

为什么这个循环只发生一次?Flutter /dart

如何在Flutter 中水平滚动堆叠定位的小部件?

我已经删除了我的 .android 密钥库,但我没有使用它,如何生成一个新的?