gpt4 book ai didi

dart - 以异步方式使用 .map()、.where() 等迭代助手?

转载 作者:IT王子 更新时间:2023-10-29 06:53:45 28 4
gpt4 key购买 nike

:toList()makeMaker 之前执行导致标记null 对象。

:在 Firestore 中,我有 tablegame 集合,在 table 里面,有一个game 字段(type=reference)。使用 StreamBuilder,我可以访问 table。然后我遍历 table 并尝试使用 get 用真实数据填充它们的 game 字段,如下所示;

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 个 null marker 的数组。我认为 makeMarker(..) 很可能还没有执行。

有没有办法让 map 方法等待 get 完成,然后用非空值初始化 markers 数组?或者你能告诉我另一种方法来完成我想要的。

最佳答案

你可以使用

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;
});

关于dart - 以异步方式使用 .map()、.where() 等迭代助手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869124/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com