Dart函数返回Future<KtList<Future<Keekz>>>,期望类型不符求助
问题解决:Firestore数据获取返回类型不匹配
问题根源
你的代码中,map操作使用了async回调,导致每个映射后的元素都是Future。直接调用toImmutableList()会将这些Future包装成列表,而非等待所有异步操作完成后返回实际的Keekz对象列表,最终返回类型变成Future<KtList<Future<Keekz>>>,与预期不符。
修正后的代码
Future<KtList<Keekz>> fetchKeekzs() async { // 获取顶层集合快照 final keekzsSnap = await FirebaseFirestore.instance.collection(Paths.keekzsToplevelCollection).get(); // 生成每个Keekz对象的Future集合 final keekzFutures = keekzsSnap.docs.map((keekzDoc) async { final keekzDocData = keekzDoc.data(); // 获取子集合卡片数据 final cardsSnap = await keekzDoc.reference.collection(Paths.keekzCardsSublevelcollection).get(); final keekzCards = Map.fromEntries( cardsSnap.docs.map((cardDoc) => MapEntry(cardDoc.id, cardDoc.data())) ); keekzDocData.addAll({"keekzCards": keekzCards}); // 转换为Domain层的Keekz对象 return KeekzDto.fromFirestoreData( keekzDocData, keekzDocData['keekzId'].toString(), ).toDomain(); }); // 等待所有异步操作完成,转换为Keekz列表后转成KtList final keekzsList = await Future.wait(keekzFutures); return keekzsList.toImmutableList(); }
关键修改说明
- 移除冗余的
.then()调用:统一使用await处理异步逻辑,代码结构更清晰,避免混用then和await导致的异步嵌套混乱。 - 使用
Future.wait()等待所有异步任务:将map生成的Iterable<Future<Keekz>>转换为Future<List<Keekz>>,确保所有子文档的异步请求完成后再生成最终列表。 - 统一类型转换时机:在所有异步操作完成后,再将普通
List<Keekz>转换为KtList<Keekz>,保证返回类型完全符合预期。
内容的提问来源于stack exchange,提问作者SRel
相关产品推荐
相关产品推荐

