Flutter中如何更新Firebase文档数组内的指定字段?
修复Firestore数组转对象的问题
问题出在你使用set方法的方式上:通过"activities." + i.toString()作为键来赋值,Firestore会将原本的数组activities转换为以数字字符串为键的对象结构,而非保持数组类型。
修复方案
改用update方法精准更新数组元素的指定字段,不需要覆盖整个元素或文档:
ChipsChoice<String>.multiple( value: activities.elementAt(i).daylistdone, onChanged: (val) => FirebaseFirestore.instance .collection(widget.user.user.uid) .doc(documentName) .update({ // 用路径语法定位数组第i个元素的daysdone字段 "activities.$i.daysdone": val, }), choiceItems: C2Choice.listFrom<String, String>( source: activities.elementAt(i).daylist, value: (i, v) => v, label: (i, v) => v, ), ),
关键说明
- 使用
update而非set:update仅修改指定字段,不会改变文档其他内容,也不会破坏数组结构;而set默认会覆盖整个文档(即便加merge: true,也没必要传入元素的所有字段)。 - 路径语法
"activities.$i.daysdone":Firestore支持通过数组名.索引.字段名的方式,直接定位数组中某个元素的具体字段进行更新,完美匹配你的需求。 - 无需重复传入其他字段:不需要再把
title、days等字段重新写一遍,update会保留这些字段的原有值,只更新daysdone。
内容的提问来源于stack exchange,提问作者Mat Koffman
相关产品推荐
相关产品推荐

