【问题标题】:Dismissing a Dismissible with Flutter/Dart使用 Flutter/Dart 关闭 Dismissible
【发布时间】: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 处理程序的宏伟计划。

【问题讨论】:

    标签: dart flutter


    【解决方案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 将在没有可关闭的情况下重新渲染
        猜你喜欢
        • 1970-01-01
        • 2019-09-10
        • 2020-09-10
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 1970-01-01
        相关资源
        最近更新 更多