我有一个代码,该代码在listview中使用dismissible(显示数据库中的项目)。撤消项目后,应该显示快餐栏,但未显示该项目,并且看来可撤消项目仍是树的一部分。你能帮我吗?
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]);
},
),
);
},
);
这在脚手架内部被称为。 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;
}
我注意到是否删除了一项,然后立即尝试创建另一项(我可以选择插入数据库): 有时会引发错误:被关闭的可关闭小部件仍是树的一部分
更新: 将删除部分移到setState之前,然后出现错误:每当我滑动以关闭
时,一个被关闭的可关闭小部件仍是树的一部分。答案 0 :(得分:0)
您可以为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
以后使用。
答案 1 :(得分:0)
您可以尝试在SnackBar中的内部内容:
Text(this.obj[position].title.toString() + "dismissed")