简短::$ ./a.out
A construct:0x781b68
1
2
AutoPtr destruct: 0x781b68
A destruct:0x781b68
AutoPtr destruct: 0x781b68
A destruct:0x781b68
在toList()
执行之前,导致makeMaker
具有markers
个对象。
长:在Firestore中,我有null
和table
集合,并且在game
的内部有一个table
字段(type =参考)。使用game
,我可以访问StreamBuilder
。然后,我遍历table
,并尝试通过使用table
在其game
字段中填充真实数据,如下所示;
get
由于if (snapshot.hasData) {
tabledocs = snapshot.data.documents;
markers = tabledocs
.map((tabledoc) {
DocumentReference gameref = tabledoc.data['game'];
//game field is a reference type field which points to another collection
gameref.get().then((gdoc) {
tabledoc.data['game'] = gdoc;
Marker marker = makeMarker(tabledoc); //<--------Executes later
return marker;
});
}).toList(); //<--------Executes first
}
需要时间,因此底部的gameref.get().then()
会在生成每个标记并将其添加到toList()
之前执行。
如果从Firestore返回了3个标记,则我们的markers
是3个markers
null
的数组。我认为marker
最有可能尚未执行。
是否有一种让makeMarker(..)
方法等待map
完成然后用非空值初始化get
数组的方法?或者您可以告诉我另一种方法来完成我想要的事情。
答案 0 :(得分:2)
您可以使用
await for(var tabledoc of tabledocs) {
}
或者如果不必要按顺序执行项目(尽管结果将按原始项目的顺序进行)
var markers = await Future.wait(tabledocs
.map((tabledoc) {
DocumentReference gameref = tabledoc.data['game'];
//game field is a reference type field which points to another collection
var gdoc = await gameref.get();
tabledoc.data['game'] = gdoc;
Marker marker = makeMarker(tabledoc);
return marker;
});