Mar*_*ert 3 list flutter google-cloud-firestore
我想将一个项目添加到列表中:
void submitAll() async {
List<UserSearchItem> userSearchItems = [];
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);
}));
print("Loaded");
print(userSearchItems.length);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我将列表的长度打印到控制台,它总是说,列表长为0 ...
print(userSearchItems.length);
Run Code Online (Sandbox Code Playgroud)
有任何建议吗?
最好的祝福
我将尝试解释这里的内容,看一下这段代码:
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
}
Run Code Online (Sandbox Code Playgroud)
异步动作(Timer)内的打印将在2秒钟后执行,这意味着异步动作结束后,但异步动作(Timer)之外的打印将直接执行而无需等待2秒钟,在这种情况下,异步动作为侦听数据.listen((data) =>,因此,如果您在异步操作之外打印长度,则不会看到延迟,因为尚未添加该项。
解决方案:您可以创建函数witch return 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);
}
Run Code Online (Sandbox Code Playgroud)
然后致电yourFunction()。