ожидание не работает для firebase querySnapshot, следующая строка выполнена - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть метод asyn c, который возвращает длину документов запроса Firebase с условием, и o реализован с использованием метода await в методе. Код ниже.

////////////////////////

getUreadMsgCount(groupChatId, id).then((result) {
    unReadCount = result;
    print("COUNT WITHIN getUreadMsgCount Method : $unReadCount");
});

print("UNREAD OUTSIDE METHOD : $unReadCount");

////// /////////////////////////////////

Future getUreadMsgCount(String groupId, String idFrom) async {
    var respectsQuery = Firestore.instance
        .collection('messages')
        .document(groupId).collection(groupId)
        .where('idFrom', isEqualTo: idFrom).where('isSeen', isEqualTo: 0);
    var querySnapshot = await respectsQuery.getDocuments();
    int totalUnread = querySnapshot.documents.length;
    return totalUnread;
}

//////// ////// OUT PUT /////////////////////////

I/flutter (28972): UNREAD OUTSIDE METHOD : 0
I/flutter (28972): UNREAD OUTSIDE METHOD : 0
I/flutter (28972): UNREAD OUTSIDE METHOD : 0
I/flutter (28972): COUNT WITHIN getUreadMsgCount Method : 2
I/flutter (28972): COUNT WITHIN getUreadMsgCount Method : 0
I/flutter (28972): COUNT WITHIN getUreadMsgCount Method : 0

Здесь, если вы заметили, это всегда выполняется строка ВНЕШНИЙ МЕТОД сначала, следовательно, всегда получает значение 0

Мне нужно сначала получить значение из инициализированного метода getUreadMsgCount, а затем перейти к следующей строке. Любая помощь?

1 Ответ

1 голос
/ 15 февраля 2020

Вам необходимо использовать await:

var result = await getUreadMsgCount(groupChatId, id);
    unReadCount = result;
  print("COUNT WITHIN getUreadMsgCount Method : $unReadCount");
  print("UNREAD OUTSIDE METHOD : $unReadCount");

Таким образом, код после асинхронного вызова метода будет выполнен после извлечения данных.

Причина этого:

getUreadMsgCount(groupChatId, id).then((result) {
    unReadCount = result;
    print("COUNT WITHIN getUreadMsgCount Method : $unReadCount");
  });

  print("UNREAD OUTSIDE METHOD : $unReadCount");

не печатает так, как вам нужно, потому что метод getUreadMsgCount является асинхронным, затем сначала выполняется код после метода then(), а когда данные полностью извлекаются, код внутри then() метод будет выполнен.

https://dart.dev/codelabs/async-await#execution -поток с асинхронностью c -и-ожидание

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