使用 Flutter/Dart 关闭 Dismissible
Posted
技术标签:
【中文标题】使用 Flutter/Dart 关闭 Dismissible【英文标题】:Dismissing a Dismissible with Flutter/Dart 【发布时间】:2018-05-23 22:13:57 【问题描述】:在 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 at ,我看到它检查了 _resizeAnimation
的状态,但我不确定它如何适合 Dismissible
构造函数或 onDismissed
处理程序的宏伟计划。
【问题讨论】:
【参考方案1】:请试试这个。我提供了 UniqueKey 作为 Dismissible 小部件的键,它工作得很好。
key: UniqueKey(),
【讨论】:
你可以直接调用key: UniqueKey()
而不是key:Key(UniqueKey().toString())
2 RoyalGriffin from here flutter.dev/docs/cookbook/gestures/dismissible // 每个 Dismissible 必须包含一个 Key。键允许 Flutter // 唯一标识小部件。键:键(项目),【参考方案2】:
确保您传递给key
参数的值也是唯一的。并且不要使用项目的索引。由于从数组中删除项目后,数组将移动项目的位置,Dismissable
小部件将无法识别项目的删除。
【讨论】:
太棒了,谢谢!我也将索引用作键的一部分,但没有意识到它会保留并导致问题。 感谢您的回答,它帮助了我,谢谢,我使用了索引,并导致我出现错误【参考方案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,它现在包含可解雇的正确实现。为方便起见,从链接中添加相关的sn-p代码
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);
);
【讨论】:
【参考方案4】:最简单的方法 1-> 使用
为列表中的每个项目设置唯一 IDvar uuid = new Uuid();
new MyItem(title: "Sanjay Singh Bisht",color:"#123ab",uniqueId:uuid.v1()));
如上所述,Dismissible 小部件需要唯一 ID
2-> 现在删除项目很简单
if (items.contains(deletedItem))
setState(()
items.remove(deletedItem);
);
3-撤消删除项目只需更新该项目ID,以便Dismissible小部件始终具有唯一ID
setState(()
deletedItem.uniqueId=uuid.v1();
);
【讨论】:
【参考方案5】:错误信息很清楚。
确保实现 onDismissed 处理程序,并在触发处理程序后立即从应用程序中删除 Dismissible 小部件。
一个空函数是不够的。一旦一个项目被解除,该小部件必须从小部件树中删除。这意味着您必须从您的 ListView
中删除 Dismissible
。
【讨论】:
这显然是错误消息所说的。在这种特定情况下,Dimissible 不是 ListView 的一部分。我没有找到删除不属于 ListView 的小部件的方法。 在您提供的代码中,Dismissible
是 ListView
的一部分
消息可能很清楚,但不清楚您如何立即从应用程序中删除 Dismissible 小部件
@LukePighetti 制作一个 setState 将在没有可关闭的情况下重新渲染以上是关于使用 Flutter/Dart 关闭 Dismissible的主要内容,如果未能解决你的问题,请参考以下文章
我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]
Flutter 中的 Azure API(面部识别)[关闭]