Я попытаюсь дать объяснение того, что происходит здесь, взгляните на этот код:
import 'dart:async';
void main() {
List<int> userSearchItems = [];
Timer _sendTimeOutTimer;
const oneSec = Duration(seconds: 2);
_sendTimeOutTimer = Timer.periodic(oneSec, (Timer t) {
userSearchItems.add(1);
print(userSearchItems.length); // result 1 and it will be executed after 2 seconds
_sendTimeOutTimer.cancel();
});
print(userSearchItems.length); // result 0 and it will be executed first
}
Печать внутри асинхронного действия (Таймер) будет выполнена через 2 секунды, значит после асинхронногодействие заканчивается, но то, которое находится за пределами асинхронного действия (Таймер), будет выполнено напрямую, без ожидания 2 секунд, в вашем случае асинхронное действие прослушивает данные .listen((data) =>
, поэтому, если вы печатаете длину вне вашего асинхронного действия, выне увидит дефент, потому что элемент еще не добавлен.
Решение: вы можете создать функцию с возвратом Future
и затем подождать, пока она не закончится, затем напечатать длину.
List<UserSearchItem> userSearchItems = [];
Future<String> submitAll() async {
Firestore.instance
.collection('insta_users')
.snapshots()
.listen((data) =>
data.documents.forEach((doc){
print(data.documents.length);
User user = new User.fromDocument(doc);
UserSearchItem searchItem = new UserSearchItem(user);
userSearchItems.add(searchItem);
print(user.bio);
return 'success';
}));
}
void yourFunction() async{
await submitAll();
print("Loaded");
print(userSearchItems.length);
}
Затем позвоните yourFunction()
.