无法在 onDismissible 中删除
Posted
技术标签:
【中文标题】无法在 onDismissible 中删除【英文标题】:Not able to delete in onDismissible 【发布时间】:2019-03-14 14:01:17 【问题描述】:我有一个代码,它在列表视图中使用可忽略(显示数据库中的项目)。关闭一个项目后,它应该显示小吃栏,但它没有显示它,似乎可关闭的项目仍然是树的一部分。你能帮我解决这个问题吗?
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;
我注意到如果我删除一个项目,然后立即尝试创建另一个项目(我可以选择插入数据库): 它有时会抛出错误:已关闭的 Dismissible 小部件仍然是树的一部分
更新: 在 setState 之前移动了删除部分,我收到错误消息:每次滑动关闭时,已关闭的 Dismissible 小部件仍然是树的一部分
【问题讨论】:
【参考方案1】:您可以为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
稍后使用。
【讨论】:
谢谢。但在这种情况下,会出现一个错误,即 Amissed Dismissible 小部件仍然是树的一部分。 @chemamolins 您可以尝试两件事:首先摆脱异步行为,然后通过 GlobalKey 访问 Scaffold。我已经编辑了我的答案以反映这一点。 你的意思是我不能使用类型Future?我也在代码的其他部分使用它,用于异步行为 是的,您可以使用期货,但我不确定是否应该使用它来删除备份 ListView 的列表项。恐怕您遇到的问题与时间有关。例如,如果您直接访问this.obj[position].title
中的项目,也许您可以直接访问列表以删除它们。
我用过:obj.removeAt(position); (obj 是这里的列表)而不是从 db 中删除。在此语句之后,我将其从数据库中删除,但在执行此操作时出现错误:引发了另一个异常:'package:flutter/src/widgets/framework.dart': Failed assertion: line 4051 pos 14: '_dependents. isEmpty':不正确。 I/flutter (18171):抛出另一个异常:在小部件树中检测到 Duplicate GlobalKey。【参考方案2】:
SnackBar里面的内容你可以试试:
Text(this.obj[position].title.toString() + "dismissed")
【讨论】:
title是String类型以上是关于无法在 onDismissible 中删除的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:为 .sheet(_: onDismiss:) 重置状态