用Flutter / Dart消除可解雇的对象

Don*_*ots 11 dart flutter

在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()
Run Code Online (Sandbox Code Playgroud)

关闭文本框后,出现错误:

被驳回的“可驳回”小部件仍是树的一部分。

确保实现onDismissed处理程序,并在该处理程序启动后立即从应用程序中删除Dismissible小部件。

浏览位于的Dismissible ,我看到它检查了的状态_resizeAnimation,但是我不确定它是否适合Dismissible构造函数或onDismissed处理程序的总体方案。

Sal*_*ley 15

请尝试这个。我提供了UniqueKey作为Dismissible小部件的键,它工作得很好。

key: UniqueKey(), 
Run Code Online (Sandbox Code Playgroud)

  • 你可以只调用 `key: UniqueKey()` 而不是 key: `Key(UniqueKey().toString())` (4认同)
  • 有人可以解释为什么这种解决方案有效吗? (2认同)

Ani*_*she 8

当小部件被关闭但未从树中删除时,由于状态仍包含被关闭的对象,因此会出现错误。onDismissed的理想实现应删除该项目并设置新状态

因此,在您的示例中,您将执行以下操作

onDismissed: (DismissDirection direction) { dismissPerson(person); }
Run Code Online (Sandbox Code Playgroud)

并在dismissPerson函数中删除该人并设置新状态。

dismissPerson(person) {
    if (_personList.contains(person)) {
    //_personList is list of person shown in ListView
      setState(() {
        _personList.remove(person);
      });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您引用问题中发布的相同链接,则该链接现在包含可实现的正确实现。为了方便起见,从链接中添加相关的代码片段

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);
      });
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

最简单的方法1->为列表的每个项目设置唯一ID

var uuid = new Uuid();

  new MyItem(title: "Sanjay Singh Bisht",color:"#123ab",uniqueId:uuid.v1()));
Run Code Online (Sandbox Code Playgroud)

如上文所述,“可禁用”窗口小部件需要唯一ID

2->现在删除项目很简单

if (items.contains(deletedItem)) {
    setState(() {
      items.remove(deletedItem);
    });
  }
Run Code Online (Sandbox Code Playgroud)

3-撤消删除项目只需更新该项目ID,以便Dismissible小部件始终具有唯一ID

setState(() {
deletedItem.uniqueId=uuid.v1();
});
Run Code Online (Sandbox Code Playgroud)


Mik*_* O. 7

确保传递给key参数的值也是唯一的。并且不要使用项目的索引。由于从数组中删除项目后,数组将移动项目的位置,因此Dismissable小部件将无法识别项目的删除。


Rém*_*let 0

错误信息非常清楚。

确保实现 onDismissed 处理程序,并在该处理程序触发后立即从应用程序中删除 Dismissible 小部件。

空函数是不够的。一旦某个项目被消除,该小部件就必须从小部件树中删除。这意味着您必须Dismissible您的ListView.

  • @LukePighetti 创建一个 setState ,它将在没有可解雇的情况下重新渲染 (3认同)