我正在构建一个应用程序,要求我使用两种强制性方法(电子邮件和电话号码)登录用户,这两种数据类型对于应用程序的正常运行至关重要。我已经实现了基于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帐户与任何电话号码都没有关联。
如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:0)
最后,我找不到解决该问题的即用型解决方案,不得不使用一堆流和Bloc来管理此状态。
答案 1 :(得分:0)
单独,您需要强制刷新用户idToken getIdToken(true)
,以便在auth用户实例上传播凭据,声明或提供者的新值。您可以阅读here了解更多信息。