Flutter-在onTap()上删除Firebase文档

时间:2019-01-01 11:13:04

标签: firebase dart flutter

我有一个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

3 个答案:

答案 0 :(得分:0)

要删除文档,我们可以使用runTransaction的{​​{1}}方法和Firestore.instance类的delete方法。

Transaction

代替

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(); 文档之前我的虚拟数据库的外观:

enter image description here

删除doc1后:

enter image description here

答案 1 :(得分:0)

如果您知道文档ID,则可以轻松删除。

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

答案 2 :(得分:0)

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