Flutter中Firestore返回DocumentSnapshot有数据但所有字段为null问题
解决方案
1. 补全文档存在性判断
snapshot.hasData 仅代表请求完成并返回了快照对象,不代表目标文档真实存在,文档不存在时也会返回空的快照实例,需额外判断快照的exists属性:
FutureBuilder<DocumentSnapshot<Map<String, dynamic>>>( future: artistaTMP, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { if (snapshot.hasError) { // 处理请求错误 return Text("请求出错:${snapshot.error}"); } if (!snapshot.data!.exists) { // 处理文档不存在的情况 return Text("目标文档不存在"); } // 走到这里才是文档真实存在 Map<String, dynamic> docData = snapshot.data!.data()!; // 调试用:直接打印原始数据,确认字段是否存在 print("原始文档数据:$docData"); Artista artistaTrovato = Artista.fromDocumentSnapshot(snapshot.data!); print(artistaTrovato.toString()); // 后续业务逻辑 ... } // 加载中状态 return CircularProgressIndicator(); } )
2. 修正实体类解析逻辑
doc.data()是可空类型,建议先提取原始数据再做字段映射,同时严格检查字段名和Firestore存储的字段名是否完全一致(大小写、拼写、特殊符号都要完全匹配):
factory Artista.fromDocumentSnapshot(DocumentSnapshot<Map<String, dynamic>> doc) { // 提前提取非空的原始数据 Map<String, dynamic> data = doc.data()!; return Artista( regione: data["regione"], citta: data["citta"], comune: data["comune"], nome: data["nome"], settore: data["settore"], lavoro: data["lavoro"], progetti: data["progetti"], id: data['id'], posts: data["posts"], ); }
3. 校验查询路径正确性
检查当前查询路径是否和Firestore实际存储路径一致:ids > tabs > {id的第一个字符} > {id}
可以在getFutureArtistById方法中打印最终查询的路径,确认和存储路径匹配:
Future<DocumentSnapshot<Map<String, dynamic>>> getFutureArtistById(String id) async { print("查询路径:ids/tabs/${id[0]}/$id"); return await FirebaseFirestore.instance .collection("ids") .doc("tabs") .collection(id[0]) .doc(id) .get(); }
如果打印的原始文档数据就是空,说明路径错误,调整路径到实际存储的位置即可。
内容的提问来源于stack exchange,提问作者Finley Adams
相关产品推荐
相关产品推荐

