在 flutter 中暂停和恢复 FirebaseAuth 状态更改侦听器

Pause and resume FirebaseAuth state changes listener in flutter

我正在开发一个应用程序,当用户是新用户时,他必须在注册后进入主页之前填写表格。我将 Firebase 身份验证与社交登录和电子邮件一起使用。

问题在于,一旦社交登录模块中的身份验证状态发生更改,侦听器就会收到通知并转到主页,而不是转到该表单页面(侦听器在包装器中 class正在监听状态变化的用户是否登录)。但是当我直接用电子邮件注册时,它工作正常。

下面是正在侦听身份验证状态更改的 StreamBuilder

StreamBuilder<User>(
        stream: Authentication().auth.authStateChanges(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.active) {
            User user = snapshot.data;
            if (user != null) {
              return Layout();
            }
            else {
              return SignIn();
            }
          }
          else {
            return Scaffold(
              body: Center(
                child: CircularProgressIndicator(),
              ),
            );
          }
        },
      )

通过查看控制台日志,我看到监听器收到通知,状态更改为已登录并立即调用主页,只有当用户已登录时才应调用主页 && 是老用户.如果用户是新用户 && 登录的,那么应该调用表单页面。我不确定如何处理这种情况,因为 authSateChanges() 返回的 Stream 没有详细说明用户是新用户还是旧用户。

有没有办法在我们获得凭据时暂停 AUthentication class 中的侦听器,因为我有机会通过以下代码行查看用户是否是新用户

UserCredential result = await auth.signInWithCredential(credential);
if(result.additionalUserInfo!.isNewUser){}

如果您严格希望用户在进入主页之前填写表格,那么使用 .isNewUser 可能不是了解用户是否新创建的好方法。因为考虑到用户在登录后立即卸载应用程序而没有填写表格然后再次重新安装的情况,这将使用户成为老用户因此不会要求填写表格,而实际上应该询问,所以这就是为什么这个方法很适合。

我建议您在使用 Cloud Functions 的 firebase 身份验证中使用自定义声明。使用自定义声明,您可以设置键值对来表示用户是否已完全注册。注册后,您可以更新自定义声明并将其传递给具有更新声明的用户,从而使用户每次登录时都能登陆主页。

要从 nodejs 环境更新自定义声明,您可以在看到表单数据更新时使用 admin.auth().setCustomUserClaims(uid, {formFilled: true})

在客户端更新 idToken,使用 var result = currentUser.getIdTokenResult() 接收更新的声明并使用 result.claims 获取声明并检查是否 result.claims["formFilled"] == true

请注意,一旦更新了自定义声明,客户端就必须显式调用 getIdTokenResult() 来强制刷新令牌。