flutter Dart函数始终返回Future

vwoqyblh  于 2023-05-29  发布在  Flutter
关注(0)|答案(1)|浏览(171)

我构建了一个存储库来从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;
ssgvzors

ssgvzors1#

就像评论中提到的@jamesdlin:
使用async回调调用.map()将返回FuturesIterable。您可以使用Future.waitIterable<Future<T>>获得List<T>
如果您观察到map函数返回Future<Keekz>而不是Keekz,因为您正在等待结果,这将导致Future<List<Future<Keekz>>>而不是所需的Future<List<Keekz>>
可以使用Future.wait代替async await来等待map函数返回的所有future,然后在toImmutableList()的帮助下将结果Keekz对象列表转换为不可变列表。
更新后的代码可能类似于:

final keekzsSnap = await FirebaseFirestore.instance
    .collection(Paths.keekzsToplevelCollection)
    .get();
final keekzFutures = keekzsSnap.docs.map((keekzDoc) async {
  final keekzDocData = keekzDoc.data();
  final cardDataSnap = await keekzDoc.reference
      .collection(Paths.keekzCardsSublevelcollection)
      .get();
  final cardData = cardDataSnap.docs;
  keekzDocData.addAll({
    "keekzCards": Map.fromEntries(
      cardData.map(
        (cardDataDoc) => MapEntry(cardDataDoc.id, cardDataDoc.data()),
      ),
    ),
  });
  return keekzDocData;
});

final keekzDTOFutures = await Future.wait(keekzFutures);
final keekzs = keekzDTOFutures.map((keekzMap) =>
    KeekzDto.fromFirestoreData(
      keekzMap,
      keekzMap['keekzId'].toString(),
    ).toDomain()).toImmutableList();

return keekzs;

这里我将keekzsSnap的获取和Map逻辑分开,以获得简单性。通过使用Future.wait(),我们等待Map逻辑返回并存储在keekzDTOFutures变量中的所有future。
最后,我们Map到keekzDTOFutures,将每个keekzMap转换为Keekz对象,并使用toImmutableList()将结果列表转换为不可变列表。
参考:wait static method

相关问题