在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小部件。
在深入研究了Dismissible source之后,我发现它检查_resizeAnimation
的状态,但我不确定它如何适应Dismissible
构造函数或onDismissed
处理程序的大方案。
6条答案
按热度按时间n3ipq98p1#
请试试这个。我提供了UniqueKey作为Dismissible widget的关键字,它工作得很好。
roejwanj2#
确保你传递给
key
参数的值也是唯一的。不要使用项目的索引。因为从数组中移除项目后,数组会移动项目的位置,Dismissable
小部件将无法识别项目的移除。tsm1rwdh3#
当小部件被解除但没有从树中删除时,就会出现错误,因为状态中仍然包含被解除的对象。
在您的示例中,您将执行以下操作
并在dispossPerson函数中删除该人并设置新的状态。
如果您引用的是问题中发布的同一个link,它现在包含dismissible的正确实现。
enyaitl34#
最简单的方法1-〉为列表的每个项目设置唯一的id
如上面提到的帖子可删除的小部件需要唯一的ID
2-〉现在删除项目很简单
3-要撤消删除项目,只需更新项目ID,使Dismissible小部件始终具有唯一ID
k4aesqcs5#
错误信息非常清楚。
确保实现onDismissed处理程序,并在该处理程序触发后立即从应用程序中删除Dismissible小部件。
一个空函数是不够的,一旦一个项目被删除,这个小部件必须从小部件树中删除,这意味着你必须从
ListView
中删除Dismissible
。rekjcdws6#
如果你使用某种类型的ListView,你必须把UniqueKey放在那个列表中,dismissible也有另一个键。
正文:可重新排序列表视图.builder(关键字:UniqueKey(),//在删除可忽略项时很重要