【问题标题】:Delete data from firebase by id using flutter使用flutter通过id从firebase中删除数据
【发布时间】:2021-03-23 07:29:51
【问题描述】:

我是 Flutter 的新手。目前我正在尝试做 CRUD。但是后来我遇到了一些错误,无法按 ID 删除数据。我确实设法进行了删除操作,但随后它将删除最新插入的数据,而不是 onTap 的数据。这里附上我的源代码。

String docId;

@override
  Widget build(BuildContext context) {
    CollectionReference users = FirebaseFirestore.instance.collection('taks');
    DocumentSnapshot ds;

return new StreamBuilder(
  stream: users.snapshots(),
  builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (!snapshot.hasData) return new Text('Loading...');

      return new ListView.builder(

          itemCount: snapshot.data.docs.length,
          itemBuilder: (context, index) {
            ds = snapshot.data.docs[index];
            // children: snapshot.data.docs.map((document) {
            return new ListTile(
              title: new Text(ds['task']),
              subtitle: Wrap(
                children: <Widget>[
                  Text("Priority: " + ds['priority']),
                  Text("   |    Status: " + ds['status']),
                ],
              ),
              onTap: (){
                docId = ds.id;
                print(docId);
              },
              trailing: Row(
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[
                  IconButton(
                      icon: Icon(
                        Icons.update_rounded,
                        size: 20.0,
                        color: Colors.brown[900],
                      ),
                      onPressed: () {
                        Navigator.push(context, MaterialPageRoute(
                            builder: (context) => UpdateScreen(docId)));
                      }
                  ),
                  IconButton(
                    icon: Icon(
                      Icons.delete_outline,
                      size: 20.0,
                      color: Colors.brown[900],
                    ),
                    onPressed: () async {
                      try {
                        FirebaseFirestore.instance
                            .collection("taks")
                            .doc(docId)
                            .delete()
                            .then((_) {
                          print("success!");
                        });
                      }
                      catch (e) {
                        print("ERROR DURING DELETE");
                      }
                      //   _onDeleteItemPressed(index);
                    },
                  ),
                ],
              ),
              // subtitle: new Text(document['priority']),
            );
          });
    // );
  },
);

所以,我尝试在选中的行上打印docId。我点击了所有数据,但它只会读取最新的数据ID。

那么任何人都可以帮我解决这个问题,如何删除只选择的数据,而不是总是删除最新的数据?提前谢谢你

【问题讨论】:

    标签: android ios firebase flutter dart


    【解决方案1】:

    我确定我了解您要删除的确切内容,但您的函数告诉 Firebase 删除带有您传递的 ID 的整个文档。

    您还为整个小部件定义了“字符串 docId”,并将其用于所有 ListView.Builder 项目。 试试这个:

    ListView.builder(
          itemCount: snapshot.data.docs.length,
          itemBuilder: (context, index) {
            ds = snapshot.data.docs[index];
            String docIdTobeDeleted= ds.id;
            // children: snapshot.data.docs.map((document) {
            return new ListTile(
              title: new Text(ds['task']),
              subtitle: Wrap(
                children: <Widget>[
                  Text("Priority: " + ds['priority']),
                  Text("   |    Status: " + ds['status']),
                ],
              ),
              onTap: (){
    //you won't be needing this anymore, instead you can type:
             print(docIdTobeDeleted);
                //docId = ds.id;
                //print(docId);
              },
    

    对于下面的firebase,使用这个:

    onPressed: () async {
       try {
           FirebaseFirestore.instance
           .collection("taks")
           .doc(docIdTobeDeleted)
           .delete()
            .then((_) {
          print("success!");
            });
             }
             catch (e) {
           print("ERROR DURING DELETE");
            }
    

    它应该可以工作。

    【讨论】:

    • 我明白了。所以,问题是我把我的 docId 放在哪里了?因此,我需要做的是在 itemBuilder 中传递 ID 对吗?
    • 正确,发生的事情是,每次您的列表构建一个新图块时,它都会为 docId 分配最新构建的图块的 ID 作为 ID。因此,列表视图中的每个条目都具有相同的 ID...并且该 ID 是列表视图构建器呈现的最后一个图块的 ID。
    • 我明白了。现在我有了更好的理解。谢谢你再次帮助我。实际上我已经面临这个问题 3 天了。
    • 不客气@jat。是的,它有时会发生,但是知道你所学的一切,它会变得更容易。祝你好运,随时回来!
    【解决方案2】:

    您的 Listtile onTap 会将 docID 设置为选定的 tileID.. 并且 deleteIconButton 将删除 docID 的 id.. 所以如果您点击第一个ListTile 并点击任何deleteIconButton.. 它将删除第一个ListTile

    您可以在deleteIconButton

    中使用直接的 ds.id 代替 docID
    IconButton(
                    icon: Icon(
                      Icons.delete_outline,
                      size: 20.0,
                      color: Colors.brown[900],
                    ),
                    onPressed: () async {
                      try {
                        FirebaseFirestore.instance
                            .collection("taks")
                            .doc(ds.Id)
                            .delete()
                            .then((_) {
                          print("success!");
                        });
                      }
                      catch (e) {
                        print("ERROR DURING DELETE");
                      }
                      //   _onDeleteItemPressed(index);
                    },
                  ),
    

    【讨论】:

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