我一直在使用userCredential.additionalUserInfo!.isNewUser
来检查用户是否是新用户,但这种方法有一个巨大的缺点,我将解释。在我的应用程序中,我想检查用户是否是新的,如果是的话,我会引导他到个人资料信息页面,否则,他将被引导到不同的页面。使用此方法(isNewUser),用户第一次登录时,它将正常工作,但如果用户第一次登录,然后由于某种原因,他在提交配置文件页面之前关闭应用程序或注销,则下一次他登录时,他将不会被视为新用户,并且他将不会被定向到配置文件页面。
我想出了一个方法,它确实工作,但它也有它的缺点。
bool isExictedUser=false;
@override
void initState(){
super.initState();
checkIfUserHasData();
}
Future<void> checkIfUserHasData () async { // to check if the user has submitted a profile form before by checking if he has a name stored in the DB
var data = await FirebaseFirestore.instance
.collection('users')
.doc(userID)
.collection('personalInfo').doc(documentID)
.get().then((value) {
setState(() {
name = value.get('name');
});
});
if (name != null){
setState((){
isExictedUser = true;
});
}else {
return;
}
}
Widget build(BuildContext context) => isExictedUser
? const HomeScreen()
:
WillPopScope(
onWillPop: _onBackPressed,
child: Scaffold(
字符串
我的方法的问题是,它需要几秒钟才能完成,所以即使用户不是新的,他也会首先被引导到个人资料页面,持续2秒钟,直到确认他有一个名字存储。
有没有办法优化(additionalUserInfo!.isNewUser)方法或替代方法来保持显示配置文件页面直到用户提交表单?
4条答案
按热度按时间w8f9ii691#
我通常在Firebase数据库中保存一个用户列表,并在那里管理用户。
每当用户身份验证成功时,我将相同的用户名输入到firebase中的一个数据库(Firestore或Realtime Database)中。现在这个数据库可以用来检查现有的用户。
请记住,数据库的这一部分应该在没有任何安全规则的情况下打开,以便可以在身份验证之前使用它。
fzwojiic2#
您可以使用FutureBuilder小部件:
字符串
有关更多信息,请参阅Documentation、stackoverflow thread、Firebase auth。
6ljaweal3#
检查用户是否是新用户的另一种方法是检查AdditionalUserInfo内部。Field detail
下面是firebase电话身份验证的代码示例,但同样可以复制到其他形式的身份验证。
字符串
3j86kqsm4#
我想你没有任何疑问与谷歌登录,所以我继续只需要代码->
字符串
希望这能有所帮助