Данные обновляются каждый раз, когда пользователь входит в Firebase в Flutter? - PullRequest
1 голос
/ 25 января 2020

Я пытаюсь войти в систему пользователя и проверить, является ли пользователь новым или нет, и если он / она является новым, дать этому конкретному пользователю 1000 монет, однако каждый раз, когда пользователь выходит из системы и входит в систему, даже если они не являются новые (они уже существуют в моей базе данных) монеты пользователя меняются на 1000, я что-то не так делаю?

int coins = 1000;

 Future<GoogleSignInAccount> _handleGoogleSignIn() async {
    try {
      final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
      final GoogleSignInAuthentication googleAuth =
          await googleUser.authentication;
      final AuthCredential credential = GoogleAuthProvider.getCredential(
        accessToken: googleAuth.accessToken,
        idToken: googleAuth.idToken,
      );
      FirebaseUser firebaseUser =
          (await _auth.signInWithCredential(credential)).user;
      if (firebaseUser != null) {
        final QuerySnapshot result = await Firestore.instance
            .collection('u')
            .where('id', isEqualTo: firebaseUser.uid)
            .getDocuments();
        final List<DocumentSnapshot> documents = result.documents;
        if (documents.length == 0) {
          // Update data to server if new user
          Firestore.instance
              .collection('u')
              .document(firebaseUser.uid)
              .setData({
            'coins': coins,
          });
        }
      }
      return googleUser;
    } catch (error) {
      return error;
    }
  }

1 Ответ

2 голосов
/ 25 января 2020

У вас несоответствие между вашим запросом и способом хранения ваших данных.

Вы сохраняете свои данные как:

  Firestore.instance
      .collection('u')
      .document(firebaseUser.uid)
      .setData({
    'coins': coins,
  });

Таким образом, каждый пользователь хранится в документе, который имеет свои UID в качестве ключа, и в нем есть одно поле с именем coins.

Затем, когда вы пытаетесь загрузить этот документ, вы делаете:

final QuerySnapshot result = await Firestore.instance
    .collection('u')
    .where('id', isEqualTo: firebaseUser.uid)
    .getDocuments();

Этот запрос ищет документы, которые имеют поле id со значением UID пользователя. А поскольку ваши документы содержат только поле coins, нет документа, соответствующего этому запросу.

Решение состоит в том, чтобы использовать прямой поиск документа пользователя вместо запроса:

final DocumentSnapshot result = await Firestore.instance
    .collection('u')
    .document(firebaseUser.uid)
    .get();
if (!documents.exists) {
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...