Flutter中如何向Firebase现有数组添加Map数据
问题
我用以下代码向Firebase上传数据:
List<Map<String, dynamic>> mapData = [ { 'name': 'name1', 'done': false, 'frequency': '1', }, { 'name': 'name2', 'done': false, 'frequency': '5', }, ]; if (isExist == false && listNameController.text.isNotEmpty) { await Firestore.instance .collection(widget.user.uid) .document(listNameController.text.toString().trim()) .setData({ 'users': mapData, });
现在我想添加更多数据,尝试了下面的代码但会覆盖全部内容,请问如何仅向'users'数组中添加新数据?
Firestore.instance .collection(widget.user.uid) .document(widget.currentList.keys.elementAt(widget.i)) .updateData({ 'users': { 'name': 'name3', 'done': false, 'frequency': '7' },
解决方案
你当前的updateData写法是直接替换users字段,自然会覆盖原有数组。要向Firestore数组中追加元素,需要使用**FieldValue.arrayUnion()**方法——它会把新元素添加到数组末尾,还能自动避免重复(不需要去重也可以使用,默认行为是去重)。
修改后的代码如下:
Firestore.instance .collection(widget.user.uid) .document(widget.currentList.keys.elementAt(widget.i)) .updateData({ 'users': FieldValue.arrayUnion([ { 'name': 'name3', 'done': false, 'frequency': '7' } ]), });
注意事项
arrayUnion()接收的参数是数组,哪怕只添加一个元素也要用数组包裹- 确保新添加的Map结构和原有数组里的元素结构一致,避免数据格式混乱
- 如果你的Firestore版本较新,需要导入
package:cloud_firestore/cloud_firestore.dart来获取FieldValue
内容的提问来源于stack exchange,提问作者Mat Koffman
相关产品推荐
相关产品推荐

