Flutter用FutureBuilder取Firebase数据出现_JsonQuerySnapshot类型转换错误如何解决
问题原因
你调用collection("cleaning").get()返回的是QuerySnapshot类型(集合查询的结果,包含该集合下所有文档的列表),不是单条文档的Map<String, dynamic>,你直接强转成Map就触发了类型不匹配的错误。
修复方案
情况1:需要遍历cleaning集合下的所有文档
把FutureBuilder返回ConnectionState.done后的逻辑改成如下:
if(snapshot.connectionState == ConnectionState.done){ // 先把snapshot.data转为QuerySnapshot类型 QuerySnapshot querySnapshot = snapshot.data as QuerySnapshot; // 遍历所有文档生成Widget列表 return ListView( children: querySnapshot.docs.map((doc) { // 单条文档数据转Map Map<String, dynamic> documentData = doc.data() as Map<String, dynamic>; return Image.network("${documentData['images'][0]}"); }).toList(), ); }
情况2:本来要查询对应serviceId的单条文档
你现在调用的是集合的get方法,如果要查单条文档,应该先指定文档id再get,修改FutureBuilder的future逻辑即可:
FutureBuilder ( // 改为查询指定id的单条文档 future: _servicesRef.doc(widget.serviceId).get(), builder: (context, snapshot){ // 原有错误判断、加载状态逻辑保留 if(snapshot.connectionState == ConnectionState.done){ // 此时snapshot.data是DocumentSnapshot类型,调用data()转Map DocumentSnapshot docSnapshot = snapshot.data as DocumentSnapshot; Map<String, dynamic> documentData = docSnapshot.data() as Map<String, dynamic>; return ListView( children: [ Image.network("${documentData['images'][0]}"), ], ); } } )
额外优化建议
- 给FutureBuilder指定明确的泛型,比如
<QuerySnapshot>或者<DocumentSnapshot>,可以提前在编译期发现类型错误,避免运行时报错 - 访问
documentData['images']之前先做判空处理,避免字段不存在时触发空指针异常
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

