监听Firebase身份验证凭据中的更改

时间:2020-04-14 19:09:54

标签: firebase flutter firebase-authentication

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

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

这是我用来根据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()屏幕。

使用Google的通讯录API获取电话号码并不能解决我的问题,因为有些Google帐户与任何电话号码都没有关联。

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

2 个答案:

答案 0 :(得分:0)

最后,我找不到解决该问题的即用型解决方案,不得不使用一堆流和Bloc来管理此状态。

答案 1 :(得分:0)

单独,您需要强制刷新用户idToken getIdToken(true),以便在auth用户实例上传播凭据,声明或提供者的新值。您可以阅读here了解更多信息。