如何在flutter中更新firebase中的收款单据?

qmb5sa22  于 2023-01-18  发布在  Flutter
关注(0)|答案(3)|浏览(163)

我想更新一个文档字段,我尝试了下面的代码,但它没有更新。
有谁能给予我个解决办法吗?
我的代码:

var snapshots = _firestore
        .collection('profile')
        .document(currentUserID)
        .collection('posts')
        .snapshots();

    await snapshots.forEach((snapshot) async {
      List<DocumentSnapshot> documents = snapshot.documents;

      for (var document in documents) {
        await document.data.update(
          'writer',
          (name) {
            name = this.name;
            return name;
          },
        );
        print(document.data['writer']);
       //it prints the updated data here but when i look to firebase database 
       //nothing updates !
      }
    });
pxy2qtax

pxy2qtax1#

对于这样的情况,我总是建议遵循documentation中的确切类型,看看有哪些选项可用。例如,DocumentSnapshot objectdata属性是Map<String, dynamic>。当你在上面调用update()时,你只是更新了文档在内存中的表示,而不是实际更新数据库中的数据。
要更新数据库中的文档,需要调用DocumentReference.updateData method,要从DocumentSnapshot获取到DocumentReference,需要调用DocumentSnapshot.reference property
比如:

document.reference.updateData(<String, dynamic>{
    name: this.name
});

与此无关,您的代码看起来有点不习惯,我建议使用getDocuments而不是snapshots(),因为后者可能会导致无限循环。

var snapshots = _firestore
        .collection('profile')
        .document(currentUserID)
        .collection('posts')
        .getDocuments();

await snapshots.forEach((document) async {
  document.reference.updateData(<String, dynamic>{
    name: this.name
  });
})

这里的区别在于getDocuments()读取数据一次,然后返回数据,而snapshots()将开始观察文档,并在发生更改时(包括更新名称时)将其传递给我们。

bvhaajcl

bvhaajcl2#

2021年更新:

API中的很多东西都发生了变化,例如,FirestoreFirebaseFirestore替换,doc被加入,等等。

*更新文档

var collection = FirebaseFirestore.instance.collection('collection');
collection 
    .doc('some_id') // <-- Doc ID where data should be updated.
    .update({'key' : 'value'}) // <-- Updated data
    .then((_) => print('Updated'))
    .catchError((error) => print('Update failed: $error'));

*更新文档中的嵌套值:

var collection = FirebaseFirestore.instance.collection('collection');
collection 
    .doc('some_id') // <-- Doc ID where data should be updated.
    .update({'key.foo.bar' : 'nested_value'}) // <-- Nested value
    .then((_) => print('Updated'))
    .catchError((error) => print('Update failed: $error'));
x6yk4ghg

x6yk4ghg3#

使用null safety更新2023

要更新文档的某些字段而不覆盖整个文档,请使用以下特定于语言的update()方法:

final washingtonRef =  FirebaseFirestore.instance.collection("cites").doc("DC");
washingtonRef.update({"capital": true}).then(
    (value) => print("DocumentSnapshot successfully updated!"),
    onError: (e) => print("Error updating document $e"));
服务器时间戳

您可以将文档中的字段设置为服务器时间戳,该时间戳用于跟踪服务器接收更新的时间。

final docRef =  FirebaseFirestore.instance.collection("objects").doc("some-id");
final updates = <String, dynamic>{
  "timestamp": FieldValue.serverTimestamp(),
};

docRef.update(updates).then(
    (value) => print("DocumentSnapshot successfully updated!"),
    onError: (e) => print("Error updating document $e"));
更新嵌套对象中的字段

如果文档包含嵌套对象,则可以在调用update()时使用"点标记法"引用文档中的嵌套字段:

// Assume the document contains:
// {
//   name: "Frank",
//   favorites: { food: "Pizza", color: "Blue", subject: "recess" }
//   age: 12
// }
 FirebaseFirestore.instance
    .collection("users")
    .doc("frank")
    .update({"age": 13, "favorites.color": "Red"});
更新数组中的元素

如果文档包含数组字段,则可以使用arrayUnion()和arrayRemove()添加和删除元素。arrayUnion()向数组添加元素,但仅添加不存在的元素。arrayRemove()删除每个给定元素的所有示例。

final washingtonRef =  FirebaseFirestore.instance.collection("cities").doc("DC");

// Atomically add a new region to the "regions" array field.
washingtonRef.update({
  "regions": FieldValue.arrayUnion(["greater_virginia"]),
});

// Atomically remove a region from the "regions" array field.
washingtonRef.update({
  "regions": FieldValue.arrayRemove(["east_coast"]),
});
递增数值

您可以递增或递减数值字段值,如下例所示。递增操作按给定的量递增或递减字段的当前值。

var washingtonRef =  FirebaseFirestore.instance.collection('cities').doc('DC');

// Atomically increment the population of the city by 50.
washingtonRef.update(
  {"population": FieldValue.increment(50)},
);

相关问题