首页 > 解决方案 > 监听 Firebase 身份验证凭据的变化

问题描述

我正在构建一个应用程序,它要求我使用两种强制方法登录用户,电子邮件和电话号码,因为这两种数据类型对于应用程序的正常运行都至关重要。我已经实现了基于 Firebase 电子邮件密码的身份验证和谷歌登录到我的应用程序以及电话验证。

现在,我已经成功地实现了这两种方法并设法将电话身份验证的凭据与电子邮件链接起来,并且在 firebase 控制台上也可以看到相同的内容,但问题是我没有收到有关身份验证凭据的任何更改的通知。

这是我用来根据状态确定显示哪个页面的代码snapshot.data

return StreamBuilder<FirebaseUser>(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting ||
            snapshot.connectionState == ConnectionState.none) {
          return Scaffold(
            body: Center(
              child: CircularProgressIndicator(),
            ),
          );
        } else {
          if (snapshot.hasError) {
            return Scaffold(
              body: Center(
                child: Text("Error signing in. Please try later"),
              ),
            );
          } else if (snapshot.hasData) {
            print("signInHandler.dart phone: ${snapshot.data.phoneNumber}");
            if (snapshot.data.phoneNumber == null) {
              return PhoneSignIn();
            }
            return MyHomePage();
          }
          return EmailSignIn();
        }
      },
    );

现在我知道根据文档,onAuthStateChanged只有在有任何登录或注销事件时才会被触发,但是有没有办法知道事件AuthCredentials已经改变,以便我可以根据数据决定要显示的适当页面?

但是,当我在链接身份验证凭据后热重新加载应用程序时,会显示相应的屏幕,即MyHomePage(). 在此之前,应用程序PhoneSignIn()在成功链接凭据后一直只显示屏幕。

使用谷歌的联系人 API 获取电话号码并没有解决我的问题,因为有些谷歌帐户与任何电话号码都没有关联。

如果有人能指出我正确的方向,我将不胜感激。

标签: firebaseflutterfirebase-authentication

解决方案


最后,我找不到任何开箱即用的解决方案,不得不使用一堆流和 Bloc 来管理这个状态。


推荐阅读