Firestore按ID获取文档失败:返回空文档问题求助
Firestore无法获取指定文档问题排查与解决
问题描述
尝试从Firestore的class集合中获取ID为5a的文档,但始终返回空文档,执行print(doc.exists())输出false。已确认无需权限,且未出现任何报错。
测试代码片段:
DocumentSnapshot doc = await db.collection('class').doc('5a').get(); print(doc.exists()); // => false
完整方法代码:
Future<Class> getClassFromFirestore(String clas) async { DocumentSnapshot doc = await db.collection('class').doc('5a').get(); SplayTreeMap<String, List<Lesson>> days = SplayTreeMap(); List<String> subjects = []; try { (await doc[ClassFields.days]).forEach((date, lessonsRaw) async { print('hep'); List<Lesson> lessons = []; lessonsRaw.forEach((lessonRaw) async { Lesson lesson = Lesson( id: lessonRaw[LessonFields.id].toString().trim(), timeblock: int.parse(lessonRaw[LessonFields.timeblock].toString().trim()), subject: lessonRaw[LessonFields.subject].toString().trim(), teacher: lessonRaw[LessonFields.teacher].toString().trim(), room: lessonRaw[LessonFields.room].toString().trim() ); lessons.add(lesson); }); days[date] = lessons; }); (await doc[ClassFields.subjects]).forEach((subject) { subjects.add(subject.toString()); }); } catch (e) { print(e.toString()); // cant get doc } print(days); return Class(name: clas, days: days, subjects: subjects); }
Firestore后台截图:
排查与修复方案
1. 核心问题排查(文档无法获取)
- 核对集合与文档ID的准确性:
Firestore对集合名称、文档ID的大小写完全敏感,确认后台集合名称是否为小写class,文档ID是否确实是5a(无空格、全角字符等隐形问题)。直接从Firestore后台复制文档ID替换代码中的字符串,避免手动输入错误。 - 验证Firestore实例配置:
确认代码中的db实例连接的是目标Firestore项目,检查初始化代码中的项目ID、应用配置是否正确,避免误连测试环境或其他项目。
2. 异步逻辑修复(文档获取后的赋值问题)
即使后续成功获取文档,当前代码中forEach嵌套async的写法会导致days无法正确填充数据(因为forEach不会等待异步操作完成),建议改用for-in循环处理:
修正后的代码示例:
Future<Class> getClassFromFirestore(String clas) async { DocumentSnapshot doc = await db.collection('class').doc('5a').get(); SplayTreeMap<String, List<Lesson>> days = SplayTreeMap(); List<String> subjects = []; if (doc.exists) { // 先判断文档是否存在再处理 try { // 用for-in替代forEach处理异步逻辑 Map<String, dynamic> daysData = doc[ClassFields.days]; for (var entry in daysData.entries) { String date = entry.key; List<dynamic> lessonsRaw = entry.value; List<Lesson> lessons = []; for (var lessonRaw in lessonsRaw) { Lesson lesson = Lesson( id: lessonRaw[LessonFields.id].toString().trim(), timeblock: int.parse(lessonRaw[LessonFields.timeblock].toString().trim()), subject: lessonRaw[LessonFields.subject].toString().trim(), teacher: lessonRaw[LessonFields.teacher].toString().trim(), room: lessonRaw[LessonFields.room].toString().trim() ); lessons.add(lesson); } days[date] = lessons; } List<dynamic> subjectsData = doc[ClassFields.subjects]; subjects = subjectsData.map((s) => s.toString()).toList(); } catch (e) { print(e.toString()); } } else { print("文档不存在"); } print(days); return Class(name: clas, days: days, subjects: subjects); }
内容的提问来源于stack exchange,提问作者Jeske
相关产品推荐
相关产品推荐

