Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 必须从树中删除Flutter Dismissible列表项_Dart_Flutter - Fatal编程技术网

Dart 必须从树中删除Flutter Dismissible列表项

Dart 必须从树中删除Flutter Dismissible列表项,dart,flutter,Dart,Flutter,我正在使用一个可驳回项目列表,并希望朝一个方向滑动以删除该项目,但朝另一个方向滑动以启动对该项目的编辑。然而,Flatter坚持认为必须从onDismissed回调中的树中删除一个可驳回的项。我已尝试重新插入该项,但不起作用。有什么想法吗?创建列表项的代码摘录如下: return new Dismissible( key: new ObjectKey(item), direction: DismissDirection.horizontal, onDismissed:

我正在使用一个可驳回项目列表,并希望朝一个方向滑动以删除该项目,但朝另一个方向滑动以启动对该项目的编辑。然而,Flatter坚持认为必须从onDismissed回调中的树中删除一个可驳回的项。我已尝试重新插入该项,但不起作用。有什么想法吗?创建列表项的代码摘录如下:

  return new Dismissible(
    key: new ObjectKey(item),
    direction: DismissDirection.horizontal,
    onDismissed: (DismissDirection direction) {
      setState(() {
        item.deleteTsk();
      });
      if (direction == DismissDirection.endToStart){
        //user swiped left to delete item
        _scaffoldKey.currentState.showSnackBar(new SnackBar(
          content: new Text('You deleted: ${item.title}'),
          action: new SnackBarAction(
            label: 'UNDO',
            onPressed: () { handleUndo(item); }
          )
        ));
      }
      if (direction == DismissDirection.startToEnd){
        //user swiped right to edit so undo the delete required by flutter
        Async.scheduleMicrotask((){handleUndo(item);});
        Navigator.of(context).pushNamed('/tskedit');
      }
    },
  ...

只要项目密钥发生变化,
可撤销的
就会认为您的项目已被撤销。假设您的item类是
MyItem
。如果在
MyItem
类中实现了一个构造函数
MyItem.from
,该构造函数将字段复制到上面,例如:

class MyItem {
  MyItem({ @required this.title, @required this.color });
  MyItem.from(MyItem other) : title = other.title, color = other.color;
  final String title;
  final Color color;
}

然后您可以将
handleUndo(item)
替换为
handleUndo(new MyItem.from(item))
,这样您的
新ObjectKey(item)
将与以前使用的旧
ObjectKey
唯一(假设您没有在
MyItem
上实现
操作符==
).

为此,您可以使用
Dismissible
小部件的
confirmdismise
功能

如果您不希望该小部件被解除,那么您只需要从
confirmsesime
返回
false

不要使用
onDismissed
进行刷卡后处理,而是使用
confirmdisease
,它将为您提供与
onDismissed
相同的刷卡方向

以下是
确认解除
功能的官方文档:

让应用程序有机会确认或否决待决解雇。 如果返回的Future完成true,则此小部件将 驳回,否则将被移回其原始位置。 如果返回的Future完成为false或null,[onResize]

下面是一个例子:

Dismissible(
  confirmDismiss: (direction) async {
    if (direction == DismissDirection.startToEnd) {
      /// edit item
      return false;
    } else if (direction == DismissDirection.endToStart) {
      /// delete
      return true;
    }
  },
  key: Key(item.key),
  child: Text(item.name),
)

天才-谢谢!更一般地说,它有点奇怪,像这样的工作是需要的。我本以为我的用例没那么不寻常。我同意
Dismissible
的这个用例很尴尬。如果您有更好的行为建议,请随时联系。嘿,有没有可能为OnTap手势而不是刷卡实现可拒绝的功能?