Dart 用颤栗/飞镖击退可击退的人
在Flatter提供的大多数示例中,它们忽略了ListView中的项。例如 我目前正在做的是:Dart 用颤栗/飞镖击退可击退的人,dart,flutter,Dart,Flutter,在Flatter提供的大多数示例中,它们忽略了ListView中的项。例如 我目前正在做的是: Widget build(BuildContext context) { return new Scaffold( key: _scaffoldKey, appBar: new AppBar( title: new Text(widget.title), ), body: new Center( child: new ListView(
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()
小部件构建(构建上下文){
归还新脚手架(
钥匙:_scaffoldKey,
appBar:新的appBar(
标题:新文本(widget.title),
),
正文:新中心(
子:新列表视图(
儿童:[
新的不屑(
key:personKey,
孩子:新文本(“解雇我”),
onDismissed:(dismissedirection){}
)
],
)//结束列表视图
)//端部中心
);//结束返回
}//结束构建()
关闭文本框后,我得到错误信息:
一个被驳回的小部件仍然是树的一部分
确保实现onDismissed处理程序,并在该处理程序启动后立即从应用程序中删除可撤销的小部件
翻开Dismissible at,我看到它检查了
\u resizeAnimation
的状态,但我不确定这是否符合Dismissible
构造函数或onDismissed
处理程序的总体方案。错误消息非常清楚
确保实现onDismissed处理程序,并在启动该处理程序后立即从应用程序中删除可撤销的小部件
空函数是不够的。一旦一个项目被取消,该小部件必须从小部件树中删除。这意味着您必须从您的
列表视图
中删除可解除的
当小部件被解除但未从树中删除时,会出现错误,因为状态仍然包含解除的对象。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);
});
}
}
如果您参考了问题中发布的相同内容,那么它现在包含了dismissible的正确实现。为了方便起见,从链接中添加相关的代码片段
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);
});
}
}
最简单的方法
1->为列表中的每个项目设置唯一id
var uuid = new Uuid();
new MyItem(title: "Sanjay Singh Bisht",color:"#123ab",uniqueId:uuid.v1()));
如上所述,post Dismissible widget需要唯一的id
2->现在删除项目很简单
if (items.contains(deletedItem)) {
setState(() {
items.remove(deletedItem);
});
}
3-要撤消删除项,只需更新该项id,使可撤销小部件始终具有唯一id
setState(() {
deletedItem.uniqueId=uuid.v1();
});
确保传递给
键
参数的值也是唯一的。并且不要使用项目的索引。由于从数组中删除项目后,数组将移动项目的位置,Dismissable
小部件将无法识别项目的删除 请试试这个。我提供了UniqueKey作为Dismissible widget的密钥,它工作得很好
key: UniqueKey(),
这显然是错误消息所说的。在这种特定情况下,dimible不是ListView的一部分。我没有找到删除不属于ListView的小部件的方法。在您提供的代码中,
Dismissible
是ListView
的一部分,消息可能很清楚,但目前还不清楚如何立即将这个不受欢迎的小部件从应用程序中删除application@LukePighetti制作一个设置状态,它将在没有被解雇的情况下重新加载伟大的设置状态,谢谢!我也使用了索引作为键的一部分,没有意识到它会保留下来并导致问题。谢谢你的回答,它帮助了我,谢谢,我使用了索引,并导致了我的错误。你只需调用key:UniqueKey()
而不是key:key(UniqueKey().toString())
2 RoyalGriffin从这里开始//每个Dismissible必须包含一个密钥。键允许flatter//唯一地标识小部件。键:键(项),