如何从Firebase Firestore获取数组数据?代码运行报错求解决方法
如何从Firebase Firestore中获取数组类型数据?
对应数据存储格式参考下图:
两次报错的根因
- 第一次空指针报错:你把单条文档返回的键值对Map误当成数组用数字索引遍历,
qn.data()![i]本身就是null,再去取postImages字段自然会触发空调用错误。Firestore单条文档是字段名:字段值的键值对结构,没有数字索引对应的内容。 - 第二次并发修改报错:你声明的局部变量
images和要修改的状态列表重名,后续images.addAll(images)相当于在迭代列表本身的同时往列表里插入自身内容,直接触发并发修改异常。
正确实现代码
// 页面状态中提前声明存储图片的数组,不要在方法内重复声明同名变量 List<String> images = []; Future<void> getImages() async { final firestore = FirebaseFirestore.instance; // 拉取指定postid对应的文档 final docSnapshot = await firestore .collection('Posts') .doc(widget.postid) .get(); // 兼容文档不存在的场景 if (!docSnapshot.exists || docSnapshot.data() == null) return; // 直接通过字段名取postImages数组,做兜底空兼容 final postImageList = List<String>.from( docSnapshot.data()!['postImages'] ?? [] ); setState(() { // 直接给状态变量赋值即可,不要做自身addAll的操作 images = postImageList; }); }
额外注意事项
- 数据转换、拉取的逻辑不要写在
setState内部,setState里只做状态变量的赋值操作即可 - 如果后续需要追加图片到已有列表,调用
addAll时传入新拉取的postImageList,不要传入images本身 - 如果数组内存储的不是字符串类型,对应调整
List<String>的泛型即可
内容的提问来源于stack exchange,提问作者user18124547
相关产品推荐
相关产品推荐

