Подозрение, я не проверял это:
Внутри второго обработчика then
вы извлекаете последнее сообщение, но к тому времени, как оно прибыло, блок завершил выполнение, и вы не ожидаетечтобы вернуться.
Возможно, попробуйте так:
void _fetch() async {
// Wait for all documents to arrive, first.
final result = await Firestore.instance
.collection('users')
.getDocuments();
List<Users> users = [];
results.documents.forEach((doc) {
Users user = new Users();
String id = doc.data['id'];
if (id.hashCode <= currentUserId.hashCode) {
groupChatId = '$id-$currentUserId';
} else {
groupChatId = '$currentUserId-$id';
}
user.Id = doc.data['id'];
user.Name = doc.data['name'];
// Wait for each single message to arrive
final m = await Firestore.instance
.collection('messages')
.document(groupChatId)
.collection(groupChatId)
.getDocuments();
if (m.documents.length > 0) {
user.LastMessage = m.documents.first.data['content'];
}
print(user.LastMessage);
users.add(user);
});
setState(() {
_users = users;
});
}
Однако учтите, что этот подход неэффективен, если у вас открыто много разговоров.
Выможно рассмотреть возможность использования Future.wait (вам нужно заменить ваш onEach
вызов на map
, который возвращает фьючерсы).