dart 用Flutter检查用户是否是FireBase认证新手的最佳方法是什么

2wnc66cl  于 2023-07-31  发布在  Flutter
关注(0)|答案(4)|浏览(155)

我一直在使用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)方法或替代方法来保持显示配置文件页面直到用户提交表单?

w8f9ii69

w8f9ii691#

我通常在Firebase数据库中保存一个用户列表,并在那里管理用户。
每当用户身份验证成功时,我将相同的用户名输入到firebase中的一个数据库(Firestore或Realtime Database)中。现在这个数据库可以用来检查现有的用户。
请记住,数据库的这一部分应该在没有任何安全规则的情况下打开,以便可以在身份验证之前使用它。

fzwojiic

fzwojiic2#

您可以使用FutureBuilder小部件:

class MyFutureWidget extends StatelessWidget{

    @override
    Widget build(BuildContext context){
        return FutureBuilder<FirebaseUser>(
            future: FirebaseAuth.instance.currentUser(),
            builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot){
                       if (snapshot.hasData){
                           FirebaseUser user = snapshot.data; // this is your user instance
                           /// is because there is user already logged
                           return MainScreen();
                        }
                         /// other way there is no user logged.
                         return LoginScreen();
             }
          );
    }
}

字符串
有关更多信息,请参阅Documentationstackoverflow threadFirebase auth

6ljaweal

6ljaweal3#

检查用户是否是新用户的另一种方法是检查AdditionalUserInfo内部。Field detail
下面是firebase电话身份验证的代码示例,但同样可以复制到其他形式的身份验证。

PhoneAuthCredential credential =
                        PhoneAuthProvider.credential(
                            verificationId: verificationId,
                            smsCode: smsCode);
                      
                        UserCredential userCred =
                        await auth.signInWithCredential(credential);
                        bool? isNewUser = userCred.additionalUserInfo?.isNewUser;

字符串

3j86kqsm

3j86kqsm4#

我想你没有任何疑问与谷歌登录,所以我继续只需要代码->

if (signInAccountTask.isSuccessful) {
  try {
    val googleSignInAccount = signInAccountTask.getResult(ApiException::class.java)
    if (googleSignInAccount != null) {
      val authCredential: AuthCredential = GoogleAuthProvider.getCredential(
        googleSignInAccount.idToken, null
      )
      // Check credential
      firebaseAuth.signInWithCredential(authCredential)
        .addOnCompleteListener(this) { task ->

          if (task.isSuccessful) {
            // following statement will check user is signed in for the first time or not
            val newUserOrNot : Boolean = task.result.additionalUserInfo?.isNewUser
            // if newUserOrNot is true, then user is new 

            startActivity(Intent(this, ProfileActivity::class.java)
              .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
            finish()
            displayToast("Firebase authentication successful")
          } else {
            displayToast("Authentication Failed :" + (task.exception?.message))
          }
        }
    }
  } catch (e: ApiException) {
    e.printStackTrace()
  }
}

字符串

希望这能有所帮助

相关问题