使用 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-> 使用

为列表中的每个项目设置唯一 ID
var 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(面部识别)[关闭]

无法使用未来值 - Flutter/Dart

如何在 Windows 上使用 dart-sdk (dart2native) 和 flutter/dart-sdk?

即使更新 Flutter,Dart 版本仍然相同

Flutter/Dart-如何使用 Duration 包显示飞蛾