首页 > 解决方案 > 如何从 Firestore 获取当前的 UserId?

问题描述

我有一个集合users,每个用户都有自己的文档。现在我想创建一个子集合来存储与特定用户相关的更多数据。

这是到目前为止的代码:

class DatabaseService {

  Future isUserRegistered(String uid) async{
    return await FirebaseFirestore.instance.collection('users')
        .where('uid', isEqualTo: uid)
        .get();
  }

  Future registerNewUser(email, password, uid) async{
    return await FirebaseFirestore.instance.collection('users')
        .doc(uid).set(
      {
        "email": email,
        "password": password,
        "uid": uid,
        "token": -1,
        "userGoal": false,
        "userGender": false,
      },
    );
  }

我创建了一个保存函数,但不是将数据存储在具有当前 uid 的文档内的子集合中,而是创建了一个名为“uid”的新文档。如何解决?

  Future saveInSubcollectionToRemote() async{
    Map<String, dynamic> data = UserManager.userWeights;
    return await FirebaseFirestore.instance.collection('users')
        .doc('uid')
        .collection('weights')
        .doc(data['userWeight'])
        .set(data);
  }

class UserManager {
  static Map<String, dynamic> userWeights = {'weights': []};
}

编辑这是我的谷歌身份验证,在这里我得到一个 id 但我想要的是 uid 而不是这个 id

  ///Authentication

  void signInGoogle(context) {
    DatabaseService handler = new DatabaseService();
    _googleSignIn
        .signIn()
        .then((userdata) => {
              print(userdata.toString()),
              handler
                  .isUserRegistered(userdata.id.toString())
                  .then((value) => {
                        if (value.docs.length == 0)
                          {
                            print("Not registered"),
                            registerUserToApp(
                                context, userdata.email.toString(), "password", userdata.id.toString())
                          }
                        else
                          {
                            print(value.docs[0].data().toString()),
                            UserManager.userdata = value.docs[0].data(),
                            Navigator.pushAndRemoveUntil(
                              context,
                              MaterialPageRoute(
                                builder: (context) {
                                  return NavBar();
                                },
                              ),
                              (route) => false,
                            ),
                          }
                      })
                  .catchError((e) => {
                        showAlertDialog(
                            context, "Error", ""),
                      })
            })
        .catchError(
            (e) => {showAlertDialog(context, "Error", "")});
  }

  void registerUserToApp(context, email, password, uid) {
    DatabaseService handler = new DatabaseService();
    try {
      handler.registerNewUser(email, password, uid).then((value) => {
            showAlertDialog(context, "Congratulations!",
                "You registered to the app"),
          });
    } catch (error) {
      print(error.toString());
      showAlertDialog(context, "Error", "");
    }
  }
}

标签: flutterdartgoogle-cloud-firestore

解决方案


您的uid代码中的 通常是用户的唯一标识。Firestore 本身不知道这样的uid. 相反,它uid来自您使用的身份提供者。

您可以使用 Google 登录中的用户 ID 来识别 Firestore 中的用户,但更常见的是使用 Firebase 登录(也)。

登录 Google 后,您可以使用这些凭据通过调用社交身份验证signInWithCredential文档中所示的方式登录 Firebase 身份验证。

登录 Firebase 身份验证后,您会从 Firebase 身份验证中获得一个 UID,然后您可以使用它来识别 Firestore 中的用户文档(以及以后对这些文档的安全访问)。

完成此操作后,您可以通过FirebaseAuth.instance.currentUser(一次)或FirebaseAuth.instance.currentUser()(连续)获取当前用户(以及他们的 UID),然后在 Firestore 调用中再次使用该用户。


推荐阅读