【问题标题】:Flutter - remove a firebase document onTap()Flutter - 删除一个 Firebase 文档 onTap()
【发布时间】:2019-05-28 10:19:25
【问题描述】:

我有一个 ListView,里面装满了 Firebase 集合作为聊天消息。

当用户长按 ListTile(列表中的一个项目)时,我会显示一个 BottomSheet。

当用户单击 BottomSheet 上的Delete 按钮时,文档应该被删除。点击“删除”按钮后,我无法找到删除所选文档的方法。

列表视图小部件:

return ListView.builder(
    padding: new EdgeInsets.all(8.0),
    reverse: true,
    itemCount: snapshot.data.documents.length,
    itemBuilder: (_, int index) {
    var message = snapshot.data.documents[index]["content"];
    var from = snapshot.data.documents[index]["idFrom"];
    return new ListTile(
        leading: new CircleAvatar(
            backgroundColor: Colors.blue,
            child: new Image.network(
                "http://res.cloudinary.com/kennyy/image/upload/v1531317427/avatar_z1rc6f.png")),
        title: new Row(
        children: <Widget>[
            new Expanded(child: new Text(message))
        ]
        ),
        subtitle: new Text(from),
        onLongPress: () {
        showModalBottomSheet<void>(context: context,
            builder: (BuildContext context) {
                return Container(
                    child: new Wrap(
                    children: <Widget>[
                        new ListTile(
                        leading: new Icon(Icons.delete),
                        title: new Text('Delete'),
                        onTap: () =>
                                          // Remove the tapped document here - how?
                                          print(snapshot.data.documents[index]["id"])
                                          Firestore.instance.collection("chats").document("ROOM_1")
                                          .collection("messages").document(snapshot.data.documents[index]["id"])
                                          .delete();
                                      )
                        )
                    ]
                    )
                );
            });
        }
    );
});

我需要在onTap() 方法中找到删除文档的方法。不知道为什么,但即使我这样做:

 onTap: () => {
     // Remove the tapped document here - how?
     const id = snapshot.data.documents[index]["id"];
 },

IDE 重新运行错误Expected an identifier

【问题讨论】:

  • 尝试去掉onTap上的粗箭头=&gt;
  • 与其他语言相比,您不能在 dart 中将箭头与 {} 结合使用,您应该尝试类似 onTap:() => snapshot.data.documents[index]["id"]
  • 我更新了代码,我仍然无法删除文档,我收到Too many positional arguments 错误。不知道出了什么问题。

标签: firebase dart flutter


【解决方案1】:

要删除一个文档,我们可以使用Firestore.instancerunTransaction方法和Transaction类的delete方法。

await Firestore.instance.runTransaction((Transaction myTransaction) async {
    await myTransaction.delete(snapshot.data.documents[index].reference);
});

而不是

Firestore.instance.collection("chats").document("ROOM_1")  
    .collection("messages").document(snapshot.data.documents[index]["id"])
    .delete();

这是删除doc1文档之前我的虚拟数据库的外观:

删除doc1后:

【讨论】:

    【解决方案2】:

    如果你知道文档id,你可以轻松删除。

      Future<void> rejectJob(String jobId){
        return _db.collection('jobs').document(jobId).delete();
      }
    

    【讨论】:

      【解决方案3】:

      2021 年更新:

      将以下代码添加到按钮的onPressed 方法中。

      final collection = FirebaseFirestore.instance.collection('collection');
      collection 
          .doc('some_id') // <-- Doc ID to be deleted. 
          .delete() // <-- Delete
          .then((_) => print('Deleted'))
          .catchError((error) => print('Delete failed: $error'));
      

      【讨论】:

        【解决方案4】:

        在 DocumentReference 上使用.delete() 方法删除您的文档,只会删除文档字段,而不是文档中的嵌套集合及其数据。

        FirebaseFirstore.instance 上使用runTransactions() 方法会完全删除文档,而不会像Jerome Escalante 所建议的那样留下任何集合或数据。

        FireBaseFirestore.instance.runTransactions((transaction) async => 
        await transaction.delete(DocumentReference));
        

        所以,使用runTransactions() 而不是delete() 方法。

        【讨论】:

          猜你喜欢
          • 2020-11-01
          • 2020-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多