我构建了一个存储库来从firestore获取数据,并将其作为名为Keekzs
的对象列表返回。
所需的目标是返回一个Future<KtList<Keekz>>
,但是我被困在这一点上,无论出于什么原因,我总是得到Future<KtList<Future<Keekz>>>
被返回。我隔离了大部分内部部分,并尽可能在其前面加上一个await表达式,但没有任何变化。
有人有主意吗?
下面是我的代码:
final keekzs = await FirebaseFirestore.instance.collection(Paths.keekzsToplevelCollection).get().then(
(keekzsSnap) async => keekzsSnap.docs.map((keekzDoc) async {
final keekzDocData = keekzDoc.data();
final cardData = await keekzDoc.reference
.collection(Paths.keekzCardsSublevelcollection)
.get()
.then(
(snapshotCards) async => snapshotCards.docs,
);
keekzDocData.addAll({
"keekzCards": Map.fromEntries(
cardData.map(
(cardDataDoc) => MapEntry(cardDataDoc.id, cardDataDoc.data()),
),
)
});
return keekzDocData;
}).map((keekzMapFuture) async {
final keekzDTO = await keekzMapFuture.then(
(keekzMap) => KeekzDto.fromFirestoreData(
keekzMap,
keekzMap['keekzId'].toString(),
).toDomain(),
);
return keekzDTO;
}).toImmutableList(),
);
return keekzs;
1条答案
按热度按时间ssgvzors1#
就像评论中提到的@jamesdlin:
使用
async
回调调用.map()
将返回Futures
的Iterable
。您可以使用Future.wait
从Iterable<Future<T>>
获得List<T>
。如果您观察到
map
函数返回Future<Keekz>
而不是Keekz
,因为您正在等待结果,这将导致Future<List<Future<Keekz>>>
而不是所需的Future<List<Keekz>>
。可以使用
Future.wait
代替async await
来等待map
函数返回的所有future,然后在toImmutableList()
的帮助下将结果Keekz
对象列表转换为不可变列表。更新后的代码可能类似于:
这里我将
keekzsSnap
的获取和Map逻辑分开,以获得简单性。通过使用Future.wait()
,我们等待Map逻辑返回并存储在keekzDTOFutures
变量中的所有future。最后,我们Map到
keekzDTOFutures
,将每个keekzMap
转换为Keekz
对象,并使用toImmutableList()
将结果列表转换为不可变列表。参考:wait static method