首页 > 解决方案 > 检查用户是否存在于 FIrestore

问题描述

我有这个使用 SignInWithGogle 登录/注册用户的功能

 void _signInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;
    final AuthCredential credential = GoogleAuthProvider.getCredential(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    final FirebaseUser user = (await _auth.signInWithCredential(credential)).user;
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getIdToken() != null);

    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);
    print('user email here $user.email');
    setState(() {
      if (user != null) {
        _success = true;
        _userID = user.uid;
        final userToSubmit = User(
            email: user.email,
            id: user.uid,
            name: user.displayName,
            owner: false,
            favorites: null);
        print('USER ID USER ID USER ID ${user.uid}');
        DocumentReference dbRef =
            Firestore.instance.collection('users').document(user.uid);
        dbRef.get().then((value) {
          print('VALUE EXISTS? ${value.exists} y VALUE $value');
          value.exists ?
            _goToHomeScreen(user)
          :
          dbRef
              .collection('prf')
              .document('profile')
              .setData(userToSubmit.toJson())
              .then(_goToHomeScreen(user));
        });
      } else {
        _success = false;
      }
    });
  }

问题是,当用户注销然后登录时,它会设置新数据并且用户丢失了他们拥有的所有东西,比如收藏夹等等......我认为检查文档是否存在应该可以解决问题,但是尽管文档在那里存在返回假。这是我正在谈论的一段代码

DocumentReference dbRef =
                Firestore.instance.collection('users').document(user.uid);
            dbRef.get().then((value) {
              print('VALUE EXISTS? ${value.exists} y VALUE $value');
              value.exists ?
                _goToHomeScreen(user)
              :
              dbRef
                  .collection('prf')
                  .document('profile')
                  .setData(userToSubmit.toJson())
                  .then(_goToHomeScreen(user));
            });
          }

为什么即使 user.uid 和文档存在它也会返回 false?我究竟做错了什么?

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


我实现的最终解决方案是这样的:

 FirebaseUser firebaseUser;
    try {
      firebaseUser = (await FirebaseAuth.instance.signInWithCredential(credential)).user;
    } catch(e) {
      print(e.toString());
    } finally {
      final userToSubmit = User(
          email: firebaseUser.email,
          id: firebaseUser.uid,
          name: firebaseUser.displayName,
          owner: false,
          restauranteAdded: false);
      DocumentReference dbRef =
      Firestore.instance.collection('users').document(firebaseUser.uid).collection('nameOfTheCollection').document('documentName');

      dbRef.get().then((data) {
        data.exists ? _goToHomeScreen(user) :  
          _createUser();
      });

这样,我检查用户文档是否存在于我的 Firestore 数据库中,如果不存在,则创建它。


推荐阅读