Flutter Firestore如何获取文档字段内DocumentReference指向的数据
解答
核心结论
Cloud Firestore 本身不支持自动获取DocumentReference指向的关联数据,所有引用对应的文档都需要你手动发起请求拉取。
具体实现方案
你可以按如下逻辑修改代码,批量拉取cards字段中所有引用指向的实际数据:
Query<Map<String, dynamic>> questionsRef = firestore .collection('questions') .where('lesson_id', isEqualTo: lessonId); // 获取题目列表快照 final snapshot = await questionsRef.get(); // 遍历所有题目文档,不要用forEach处理异步逻辑,避免出现等待异常 for (final document in snapshot.docs) { final data = document.data(); dynamic questionTemp; switch (data['question_type']) { // 其他题型的处理逻辑保持不变 case 'cards': questionTemp = CardsQuestionModel.fromJson(data); // 取出cards字段的DocumentReference列表 final List<DocumentReference> cardRefs = List.from(data['cards']); // 并行发起所有引用的拉取请求,提升请求效率 final cardRequestList = cardRefs.map((ref) => ref.get()).toList(); final cardSnapshotList = await Future.wait(cardRequestList); // 转换快照为实际业务数据,你也可以根据需求封装为对应的CardModel实例 final cardDataList = cardSnapshotList.map((snap) => snap.data() as Map<String, dynamic>).toList(); // 建议提前在CardsQuestionModel中新增cardDetails字段存储拉取到的关联数据 questionTemp.cardDetails = cardDataList; break; } questionTemp.id = document.id; questions.add(questionTemp); }
注意事项
- 避免在
forEach回调中处理异步逻辑,forEach不会等待异步任务执行完成,会出现后续访问关联数据时请求还未返回的异常。 - 使用
Future.wait可以并行处理所有拉取请求,比逐个await请求耗时更短。 - 如果卡片数据更新频率低,可以接入本地缓存存储已拉取过的卡片数据,减少重复请求,降低Firestore的读写成本。
内容的提问来源于stack exchange,提问作者Jeoxs
相关产品推荐
相关产品推荐

