Android 在flutter中使用firebase登录谷歌时,如何检查用户是新用户还是现有用户?

Android 在flutter中使用firebase登录谷歌时,如何检查用户是新用户还是现有用户?,android,firebase,flutter,firebase-authentication,Android,Firebase,Flutter,Firebase Authentication,我正在做一个项目,在这个项目中,用户数据将保存在Fire store中。当用户登录google时,我正在为用户制作新文档。下面是我的代码 import 'package:firebase_auth/firebase_auth.dart'; import 'package:gfd_official/User/User.dart'; import 'package:gfd_official/services/database.dart'; import 'package:google_sign_in

我正在做一个项目,在这个项目中,用户数据将保存在Fire store中。当用户登录google时,我正在为用户制作新文档。下面是我的代码

import 'package:firebase_auth/firebase_auth.dart';
import 'package:gfd_official/User/User.dart';
import 'package:gfd_official/services/database.dart';
import 'package:google_sign_in/google_sign_in.dart';

class GSignInhelp {
 final FirebaseAuth _auth = FirebaseAuth.instance;

 //Firebase User
 Userdat _userFromFirebase(User user) {
 return user != null ? Userdat(uid: user.uid) : null;
 }

 //auth change user stream
 Stream<Userdat> get user {
 return _auth.authStateChanges().map(_userFromFirebase);
}

Future signInWithGoogle() async {
GoogleSignIn googleSignIn = GoogleSignIn();
final account = await googleSignIn.signIn();
final auth = await account.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: auth.accessToken,
idToken: auth.idToken,
);
try {
final res = await _auth.signInWithCredential(credential);
User user = res.user;
await DatabaseService(uid: user.uid)
    .updateUserRole(user.displayName, user.email, 'basic');
return _userFromFirebase(user);
} catch (e) {
  print(e.toString());
  return null;
  }
}

Future logOut() async {
try {
  GoogleSignIn().signOut();
  return await _auth.signOut();
} catch (e) {
  print(e.toString());
  return null;
}
}
}
import'package:firebase_auth/firebase_auth.dart';
导入“包:gfd_官方/User/User.dart”;
导入“包:gfd_official/services/database.dart”;
导入“包:google_sign_in/google_sign_in.dart”;
类gsignnhelp{
final FirebaseAuth _auth=FirebaseAuth.instance;
//Firebase用户
Userdat\u userFromFirebase(用户){
返回用户!=null?Userdat(uid:user.uid):null;
}
//身份验证更改用户流
流获取用户{
返回_auth.authStateChanges().map(_userFromFirebase);
}
未来登录使用Google()异步{
谷歌签名谷歌签名=谷歌签名();
最终账户=等待谷歌登录。登录();
最终验证=等待帐户验证;
最终凭证=GoogleAuthProvider.credential(
accessToken:auth.accessToken,
idToken:auth.idToken,
);
试一试{
最终res=等待_auth.signin with credential(凭证);
User=res.User;
等待数据库服务(uid:user.uid)
.updateUserRole(user.displayName、user.email、'basic');
返回\u userFromFirebase(用户);
}捕获(e){
打印(如toString());
返回null;
}
}
将来注销()异步{
试一试{
GoogleSignIn().signOut();
return wait_auth.signOut();
}捕获(e){
打印(如toString());
返回null;
}
}
}
我可以成功地更改fire store中的用户角色,但正如您所看到的,当用户在数据库中签名时,值将设置为默认值,但我不希望这样。所以,我的问题是如何检查用户是首次登录还是返回用户

如果用户正在返回,则我不想重置Fire store中的用户数据,如果用户是新用户,则使用默认值在Fire store中创建文档


结论:,当用户登录google时,我如何检查该用户是现有用户还是新用户?

您可以通过
user Credential
检查该用户是新用户还是以前注册的用户,如果该用户以前未注册,则可以通过
authResult.additionalUserInfo.isNewUser
检索该用户

您可以使用以下代码:

 Future<UserCredential> signInWithGoogle(BuildContext context) async {

    FirebaseAuth _auth = FirebaseAuth.instance;
    // Trigger the authentication flow
    final GoogleSignInAccount googleUser = await GoogleSignIn().signIn();

    // Obtain the auth details from the request
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;

    // Create a new credential
    final GoogleAuthCredential credential = GoogleAuthProvider.credential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );

    final UserCredential authResult =
        await _auth.signInWithCredential(credential);

    final User user = authResult.user;

    ///Her to check isNewUser OR Not
    if (authResult.additionalUserInfo.isNewUser) {
      if (user != null) {
      //You can her set data user in Fire store
      //Ex: Go to RegisterPage()
        }

      }
    } else {
     
      //Ex: Go to HomePage()
    }

    return await FirebaseAuth.instance.signInWithCredential(credential);
  }
Future Signing与Google(BuildContext上下文)异步{
FirebaseAuth _auth=FirebaseAuth.instance;
//触发身份验证流
final GoogleSignInAccount googleUser=等待GoogleSignIn().signIn();
//从请求中获取身份验证详细信息
最终谷歌签名认证=
等待googleUser.authentication;
//创建新凭据
最终GoogleAuthCredential凭证=GoogleAuthProvider.credential(
accessToken:googleAuth.accessToken,
idToken:googleAuth.idToken,
);
最终用户凭证验证结果=
使用凭证(凭证)等待授权登录;
最终用户=authResult.User;
///她需要检查是否为新用户
if(authResult.additionalUserInfo.isNewUser){
如果(用户!=null){
//您可以在Fire store中设置她的数据用户
//例如:转到注册表页()
}
}
}否则{
//例如:转到主页()
}
返回wait wait FirebaseAuth.instance.signInWithCredential(凭证);
}

您可以在数据库中手动创建一个用户对象来保存该用户的数据,如果该用户存在于数据库中,则该用户为旧用户,如果不存在,则为旧用户new@AhmadSattout我们可以这样做,但只要用户关闭应用程序并再次打开,fire store中的用户数据就会设置为默认值