在Flutter提供的大多数Dismissible示例中,他们正在解雇ListView中的项目。例如,this。
我目前正在做的是:
Widget build(BuildContext context) {
return new Scaffold(
key: _scaffoldKey,
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: new ListView(
children: <Widget>[
new Dismissible(
key: personKey,
child: new Text('Dismiss Me'),
onDismissed: (DismissDirection direction) {}
)
],
) // end ListView
) // end Center
); // end return
} // end build()
在我关闭文本框后,我收到错误:
被驳回的Dismissible窗口小部件仍然是树的一部分。
确保实现onDismissed处理程序,并在处理程序触发后立即从应用程序中删除Dismissible窗口小部件。
通过可摘source,我看到它会检查_resizeAnimation
的状态,但我不确定它是如何适应Dismissible
的宏计划的构造函数或onDismissed
处理程序。
答案 0 :(得分:4)
最简单的方法 1->使用
为列表的每个项目设置唯一IDvar uuid = new Uuid();
new MyItem(title: "Sanjay Singh Bisht",color:"#123ab",uniqueId:uuid.v1()));
如上文文章“可弃部件”中所述,需要唯一ID
2->现在删除其简单项目
if (items.contains(deletedItem)) {
setState(() {
items.remove(deletedItem);
});
}
3-要撤消删除项目,只需更新该项目ID,以使Dismissible小部件始终具有唯一ID
setState(() {
deletedItem.uniqueId=uuid.v1();
});
答案 1 :(得分:3)
当窗口小部件被解除但未从树中删除时,会出现错误,因为状态仍包含被解除的对象。 onDismissed的理想实现应该删除项目并设置新状态
所以在你的例子中你会做这样的事情
onDismissed: (DismissDirection direction) { dismissPerson(person); }
并在dismissPerson函数中删除此人并设置新状态。
dismissPerson(person) {
if (_personList.contains(person)) {
//_personList is list of person shown in ListView
setState(() {
_personList.remove(person);
});
}
}
如果你引用问题中发布的同一link,它现在包含适当的可执行实施。为方便起见,从链接添加相关的代码片段
final Widget card = new Dismissible(
key: new ObjectKey(cardModel),
direction: _dismissDirection,
onDismissed: (DismissDirection direction) { dismissCard(cardModel); },
....
);
void dismissCard(CardModel card) {
if (_cardModels.contains(card)) {
setState(() {
_cardModels.remove(card);
});
}
}
答案 2 :(得分:2)
请尝试此操作。我提供了UniqueKey作为Dismissible小部件的键,并且效果很好。
key:Key(UniqueKey()。toString()),
答案 3 :(得分:1)
错误信息非常清楚。
确保实现onDismissed处理程序,并在该处理程序触发后立即从应用程序中立即删除“允许的”窗口小部件。
空功能是不够的。项目被解除后,必须从窗口小部件树中删除该窗口小部件。这意味着您必须从您的Dismissible
中删除ListView
。
答案 4 :(得分:1)
请确保您传递给key
参数的值也是唯一的。并且不要使用项目的索引。由于从数组中删除项目后,数组将移动项目的位置,因此Dismissable
小部件将无法识别项目的删除。