如何在flutter中更新Firebase中的收集文档?

时间:2019-11-24 11:55:17

标签: firebase flutter dart google-cloud-firestore

我想更新一个文档字段,但是我尝试了以下代码,但是没有更新。

有人可以给我一个解决方案吗?

我的代码:

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 !
      }
    });

2 个答案:

答案 0 :(得分:1)

对于这种情况,我总是建议您遵循documentation中的确切类型,以查看可用的选项。例如,DocumentSnapshot objectdata属性是Map<String, dynamic>。调用update()时,您只是在更新文档的内存表示形式,而实际上没有更新数据库中的数据。

要更新数据库中的文档,您需要调用DocumentReference.updateData method。为了从DocumentSnapshotDocumentReference,您叫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()将开始观察文档,并在发生任何更改(包括更新名称)时将其传递给我们)。

答案 1 :(得分:1)

2021 年更新:

API 中有很多变化,例如,Firestore 被替换为 FirebaseFirestoredoc 被替换,等等。

  • 更新文档

    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'));