Flutter中如何将Google登录信息保存到Firebase Cloud Firestore中

6
我已在我的Flutter应用程序中实现了google_sign_in包。 我正在使用Google进行注册,并将数据保存在Cloud Firestore数据库中。我可以正确保存数据。
我想要的是,下一次有人尝试再次使用相同的电子邮件通过Google进行注册时,它将从数据库中检查并显示他已经拥有一个帐户,并要求使用Google“登录”。
我之所以想要这样做,是因为我将更新用户数据并注销。
如果我再次使用相同的Google电子邮件进行登录/注册,它将使用来自Google个人资料的详细信息替换我的更新数据。我希望Firestore中的更新数据保持不变,而不是每次登录都更新。
请问有谁能帮助我解决这个问题吗?谢谢!
2个回答

7

如果用户是新用户并且已存储在用户集合中,则此函数返回true。

`Future<bool> isNewUser(FirebaseUser user) async {
QuerySnapshot result = await firestore
        .collection("users")
        .where("email", isEqualTo: user.email)
        .getDocuments();
    final List<DocumentSnapshot> docs = result.documents;
    return docs.length == 0 ? true : false;
  }`

首先检查用户是否是新用户,使用上述功能,如果用户是新用户,则将用户详细信息添加到用户集合中,例如

`Future<void> addUserToDb(FirebaseUser currentuser) async {
    user = User(
        uid: currentuser.uid,
        email: currentuser.email,
        name: currentuser.displayName,
        profilePhoto: currentuser.photoUrl,
         );
    firestore
        .collection("users")
        .document(currentuser.uid)
        .setData(user.toMap(user));
  }`

如果用户不是新用户,则显示登录界面。

这正是我在寻找的。非常感谢! - MRN

-1

基本上有几种方法,我在这里描述我知道的方法

1) firebase_auth

实际上 Firebase 应该会自动处理它(除非您使用第二个选项,即 HTTP 请求)

但通常 firebase_auth 应该可以解决问题

authResult = await _auth.createUserWithEmailAndPassword(
          email: email,
          password: password,
        );

然后,如果您将其放入try {} on PlatformException catch(error) {}块中,您可以通过error.message来获取可读的错误信息。

2)http请求

或者,如果您喜欢通过http请求来完成它

您需要手动处理它。

await Provider.of<Auth>(context, listen: false).signup(
          _authData['email'],
          _authData['password'],
        );

此外,如果您将其放在 try {} on HttpExceptions catch(error) {} 块中,您可以通过 error.toString().contains(ERROR_TYPE)(其中 ERROR_TYPE 可以是 ERROR_INVALID_EMAILINVALID_EMAILERROR_EMAIL_ALREADY_IN_USE 等)来利用它,并手动定义您的情况。
总的来说,我建议选择第一种选项,因为它可以减轻您的许多负担。
希望这有所帮助!

感谢您的回复,非常感激。 - MRN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接