首页 > 解决方案 > 在颤动中暂停和恢复 FirebaseAuth 状态更改侦听器

问题描述

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

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

下面是正在监听身份验证状态更改的 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 类中暂停侦听器,因为我有机会通过以下代码行查看用户是否是新用户

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

标签: flutterfirebase-authenticationgoogle-signinstream-builder

解决方案


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

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

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

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

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


推荐阅读