【发布时间】:2020-10-28 04:25:56
【问题描述】:
我在一个项目中使用了 Flutter Web 和 Firebase,但遇到了一个问题。我正在尝试更新 firestore 数组中的地图。
使用这个:
var val = [];
val.add({'groupUID': groupUID, 'inviteStatus': status});
var userInviteUID;
await users
.document(uid)
.get()
.then((value) => userInviteUID = value.data['inviteUID']);
await invites
.document(userInviteUID)
.updateData({'invites': FieldValue.arrayUnion(val)});
我得到了这个结果: firestore structure
我想要做的只是将地图中的 1 更改为 2。我认为它会更新,因为它的值相同,但它只是将它添加到数组中。
我在堆栈上环顾四周,发现了一些方法,例如复制整个数组并在需要的地方更改它,然后将其添加回来。
但我想知道是否有办法通过对我的代码添加一些修改来避免这种情况。如果我应该使用更好的结构,也请告诉我。感谢您的帮助!
更新:
var ref = invites.document(userData.inviteUID);
ref.get().then((value) async {
var invitesList = value.data['invites'];
switch (status) {
case 1:
break;
case 2:
var index;
invitesList.asMap().forEach((key, value) {
if (value['groupUID'] == groupUID) index = key;
});
invitesList.removeAt(index);
await invites
.document(userData.inviteUID)
.updateData({'invites': FieldValue.arrayUnion(invitesList)});
break;
default:
}
所以我查看了一些打印语句,发现具有匹配组 uid 的元素已被删除,但查看 firebase,该数组没有被覆盖任何东西......有什么想法吗?
最终更新:
var ref = invites.document(userData.inviteUID);
ref.get().then((value) async {
var invitesList = value.data['invites'];
switch (status) {
case 1:
break;
case 2:
var index;
invitesList.asMap().forEach((key, value) {
if (value['groupUID'] == groupUID) index = key;
});
invitesList.removeAt(index);
await invites
.document(userData.inviteUID)
.setData({'invites': FieldValue.arrayUnion(invitesList)});
break;
default:
}
通过将 updateData 更改为 setData 来修复它。
【问题讨论】:
-
你知道该怎么做吗,我陷入了同样的境地
标签: firebase flutter dart google-cloud-firestore flutter-web