用颤动/飞镖解雇一个允许的

时间:2017-12-10 02:00:40

标签: 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()

在我关闭文本框后,我收到错误:

  

被驳回的Dismissible窗口小部件仍然是树的一部分。

     

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

通过可摘source,我看到它会检查_resizeAnimation的状态,但我不确定它是如何适应Dismissible的宏计划的构造函数或onDismissed处理程序。

5 个答案:

答案 0 :(得分:4)

最简单的方法 1->使用

为列表的每个项目设置唯一ID
var 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小部件将无法识别项目的删除。