flutter 用扑动/ dart 将被解雇者解雇

u91tlkcl  于 2023-02-25  发布在  Flutter
关注(0)|答案(6)|浏览(145)

在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处理程序的大方案。

n3ipq98p

n3ipq98p1#

请试试这个。我提供了UniqueKey作为Dismissible widget的关键字,它工作得很好。

key: UniqueKey(),
roejwanj

roejwanj2#

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

tsm1rwdh

tsm1rwdh3#

当小部件被解除但没有从树中删除时,就会出现错误,因为状态中仍然包含被解除的对象。
在您的示例中,您将执行以下操作

onDismissed: (DismissDirection direction) { dismissPerson(person); }

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

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

如果您引用的是问题中发布的同一个link,它现在包含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);
      });
    }
}
enyaitl3

enyaitl34#

最简单的方法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();
});
k4aesqcs

k4aesqcs5#

错误信息非常清楚。
确保实现onDismissed处理程序,并在该处理程序触发后立即从应用程序中删除Dismissible小部件
一个空函数是不够的,一旦一个项目被删除,这个小部件必须从小部件树中删除,这意味着你必须从ListView中删除Dismissible

rekjcdws

rekjcdws6#

如果你使用某种类型的ListView,你必须把UniqueKey放在那个列表中,dismissible也有另一个键。
正文:可重新排序列表视图.builder(关键字:UniqueKey(),//在删除可忽略项时很重要

itemCount: db.toDoList.length,
   itemBuilder: (BuildContext context, int index) {
     return Dismissible(
     key: **Key**('$index'),

相关问题