1

我有一个代码,它在列表视图中使用可关闭(显示数据库中的项目)。关闭一个项目后,它应该显示小吃栏,但它没有显示它,似乎可关闭的项目仍然是树的一部分。你能帮我解决这个问题吗?

return ListView.builder(
  itemCount: count,
  itemBuilder: (BuildContext context, int position) {
    final ThemeData theme = Theme.of(context);

    return Dismissible(

      key: Key(this.objs[position].id.toString()),
      onDismissed: (direction) {
        setState(() async {
          int result = await helper.delete(this.objs[position].id);
        });
        Scaffold.of(context)
            .showSnackBar(SnackBar(
            content: Text(this.objs[position].title + "dismissed")));
      },
      background: Container(
          color: Colors.red,
          child: const ListTile(
              leading: Icon(Icons.delete, color: Colors.white, size: 36.0)
          )
      ),

      child: ListTile(
        leading: CircleAvatar(
          backgroundColor: getColor(this.objs[position].priority),
          child: Text(this.objs[position].id.toString()),
        ),
        title: Text(obj[position].title),
        subtitle: Text(objs[position].date),
        onTap: () {
          debugPrint("Tapped on " + objs[position].id.toString());
          navigateToDetail(this.objs[position]);
        },
      ),
    );
  },
);

这在 Scaffold 内部被调用。objs 是一个列表,其中包含我在数据库中的所有对象。

这是我在 onDismissed 中调用的删除代码:

    Future<int> delete(int id) async {
    Database db = await this.db;
    var result = await db.rawDelete("DELETE FROM $tblT WHERE $colId=$id");
    return result;
  }

我注意到如果我删除一个项目,然后立即尝试创建另一个项目(我可以选择插入 DB):它有时会抛出错误:已关闭的 Dismissible 小部件仍然是树的一部分

更新:在 setState 之前移动了删除部分,我收到错误:每次我滑动关闭时,已关闭的 Dismissible 小部件仍然是树的一部分

4

2 回答 2

2

您可以为该onDismissed:属性尝试以下代码。

问题是 onDismissed 函数内部的未来。我们需要重新排序 async 和 await 关键字。

无论如何,在删除连续项目时要注意时间。

onDismissed: (direction) async {
    String title = this.obj[position].title;
    await helper.delete(this.obj[position].id);
    setState(() {});
    Scaffold.of(context)
       .showSnackBar(SnackBar(content: Text("$title dismissed")));
},

它还将异步移出setState()并存储标题以供SnackBar.

于 2018-10-09T18:51:32.507 回答
0

SnackBar 里面的内容你可以试试:

Text(this.obj[position].title.toString() + "dismissed")
于 2018-10-09T19:24:27.687 回答