Flutter Futurebuilder ничего не возвращает - PullRequest
0 голосов
/ 31 января 2020

У меня есть Futurebuilder во флаттере, но он никогда ничего не возвращает.

Как вы можете видеть ниже, у меня есть Futurebuilder, который вызывает метод с именем getGamesLost. Если данных нет, он покажет индикатор загрузки.

  FirestoreUserProfile firestoreUserProfile = new FirestoreUserProfile();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: firestoreUserProfile.getGamesLost(),
        builder: (BuildContext context, AsyncSnapshot<int> userProfileData) {
          if(userProfileData.hasData) {
             print(userProfileData);
          }
          else {
            return Styling.loadingIndicator;
          }
        }
    );

Моя проблема в том, что данных никогда не бывает. Ниже приведен метод getGamesLost.

  Future<int> getGamesLost() async {
    return await firestoreCollectionReference
        .document(FirebaseUserData.currentFirebaseUser.email)
        .snapshots().forEach((userData) {
          return userData.data[describeEnum(fieldNames.profile)][describeEnum(fieldNames.gamesLost)];
    });
  }

По какой-то причине getGamesLost, который вызывается futurebuilder, никогда не завершается. Я могу напечатать значение userData непосредственно перед последним возвратом, что означает, что на самом деле есть данные, возвращаемые из firebase, но это так, как если бы метод никогда не возвращался, а futurebuilder просто продолжает ждать.

1 Ответ

0 голосов
/ 01 февраля 2020

Это потому, что вы используете поток, возвращаемый snapshots(), для получения и повторения данных. Этот поток остается живым и слушает любые обновления данных в реальном времени. Функция forEach здесь даст вам Future, но она завершится только тогда, когда завершится Stream, возвращаемый snapshots(). Следовательно, Future никогда не завершается.

Если вы просто хотите получить значение из документа, просто используйте его следующим образом.

// The `get` method instead of `snapshots` just fetches the doc at this instance and would not listen for updates
Future<int> getGamesLost() async {
  return await firestoreCollectionReference
      .document(FirebaseUserData.currentFirebaseUser.email)
      .get() 
      .then((DocumentSnapshot userData) {
    return userData.data[describeEnum(fieldNames.profile)]
        [describeEnum(fieldNames.gamesLost)];
  });
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...