【发布时间】:2020-04-14 19:09:54
【问题描述】:
我正在构建一个应用程序,该应用程序要求我使用电子邮件和电话号码这两种强制方法登录用户,因为这两种数据类型对于应用程序的正常运行都至关重要。我已经实现了基于 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 获取电话号码并没有解决我的问题,因为有些谷歌帐户没有与任何电话号码关联。
如果有人能指出我正确的方向,我将不胜感激。
【问题讨论】:
-
您要检测哪种类型的身份验证凭据更改?
-
就像通知我新凭据已与当前登录的用户相关联的那个。
-
我不认为
onAuthStateChanged应该为此开火,是吗? -
您可能需要检查 ID 令牌更改是否触发:firebase.google.com/docs/reference/js/…
-
我尝试使用 idToken 但我无法让它工作。 idtoken 侦听器未收到凭据链接事件的通知。我检查了出现在终端上的日志,也有
Notifying id token listeners about user消息仅在仅从电子邮件登录后打印,而不是在链接后打印
标签: firebase flutter firebase-authentication