如何修改Flutter代码实现向Firestore写入数组格式而非Map格式数据
实现方案
场景1:每次写入直接覆盖整个数组字段
如果你不需要保留之前写入的数组内容,每次点击直接用新的数组覆盖该字段,写法如下:
// 1. 先构造你要存入的单个数据项 Map<String, dynamic> currentItem = { "productName": "示例商品名", "price": 19.99, // 补充你自己的业务字段 }; // 2. 写入时直接将字段赋值为包裹该对象的数组 await FirebaseFirestore.instance .collection("你的集合名称") .doc("对应文档ID") .set( { "你要存的字段名": [currentItem] }, // 如果需要保留文档内其他字段不被覆盖,开启merge配置 SetOptions(merge: true), );
场景2:在已有数组基础上追加新元素(不覆盖历史数据)
如果你需要保留之前已经存入数组的内容,只追加新的点击项,直接用Firestore官方提供的arrayUnion原子操作即可,无需自己读取数组再拼接:
// 1. 构造新的待添加数据项 Map<String, dynamic> newItem = { "productName": "示例商品名", "price": 19.99, // 补充你自己的业务字段 }; // 2. 调用arrayUnion追加元素 await FirebaseFirestore.instance .collection("你的集合名称") .doc("对应文档ID") .update({ "你要存的字段名": FieldValue.arrayUnion([newItem]), });
注意事项
- 即使对应文档的数组字段还未创建,
arrayUnion也会自动初始化数组类型的字段,无需额外做判空处理 - 如果需要删除数组内指定元素,可使用
FieldValue.arrayRemove([待删除元素])实现
内容的提问来源于stack exchange,提问作者Ricky Kim
相关产品推荐
相关产品推荐

