Функция Flireter Firestore не возвращает совокупное значение счетчика - PullRequest
0 голосов
/ 06 марта 2019

Я установил распределенный счетчик лайков и хочу подсчитать общее количество лайков в распределенном счетчике.

Счетчик настроен в соответствии с моей моделью «posts» как подколлекция «count_shrads», которая включает три документа (1, 2, 3), каждый из которых имеет поле «count».Я хочу создать функцию во флаттере, которая возвращает общее количество этих полей подсчета для каждого из трех документов для данной статьи.

Future getTotal(postID) async {
    int counter;
    Firestore.instance
        .collection('post').document(postID).collection('count_shrads')
        .snapshots()
        .listen((data) =>
        data.documents.forEach((doc) => counter += (doc["count"])));
    print("The total is $counter");
    return counter;
  }

В настоящее время возвращается значение NULL.Кто-нибудь знает, как я могу вернуть совокупное значение?


Используя функцию уменьшения:

Future getTotal(postID) async {
    int value;
    Firestore.instance
        .collection('post').document(postID).collection('count_shrads')
        .snapshots()
        .listen((data) =>
        data.documents.reduce((value, element) => value + doc["count"])
    );
    return value;
  }

Добавление изображения модели данных в Firestore. enter image description here

1 Ответ

0 голосов
/ 06 марта 2019

Если вы хотите использовать результат асинхронного вызова, вам нужно подождать, пока результат станет доступным

Future getTotal(postID) async {
    int counter;
    await Firestore.instance // <<<== changed
        .collection('post').document(postID).collection('count_shrads')
        .snapshots()
        .listen((data) =>
        data.documents.forEach((doc) => counter += (doc["count"])));
    print("The total is $counter");
    return counter;
  }
}

Без await return counter; выполняется немедленно, а counter += ... значительнопозже выполняется, когда приходит ответ от сервера Firebase.await гарантирует, что приведенный ниже код будет выполняться только после того, как Future, возвращенный из асинхронного вызова, будет завершен (выполнение выполнено или произошла ошибка)

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