dart Flutter Dismissible坚持列表项必须从树中删除

ny6fqffe  于 2023-06-19  发布在  Flutter
关注(0)|答案(3)|浏览(206)

我正在使用一个“不可接受”项目列表,希望在一个方向上滑动删除项目,但在另一个方向上滑动启动项目编辑。然而,Flutter坚持认为必须在onDismissed回调中从树中删除Disabilities项。我试过重新插入项目,但没有工作。有什么想法吗?从创建列表项的代码中提取如下:

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');
      }
    },
  ...
cwtwac6a

cwtwac6a1#

您可以使用Dismissible小部件的confirmDismiss功能来实现此目的。
如果您不希望小部件被关闭,那么您只需要从confirmDismiss返回false
不要使用onDismissed来进行滑动后处理,使用confirmDismiss,它会像onDismissed一样提供滑动方向。
以下是confirmDismiss函数的官方文档:
让应用有机会确认或否决待处理的驳回。如果返回的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),
)
omjgkv6w

omjgkv6w2#

Dismissible将认为您的项目被驳回,只要项目键更改。假设你的物品类别是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(new MyItem.from(item))替换handleUndo(item),这样您的new ObjectKey(item)将不同于您之前使用的旧ObjectKey(假设您没有在MyItem上实现operator ==)。

vc6uscn9

vc6uscn93#

确认解散你仍然留在动画地狱...推荐查看Flutter核心问题,它旨在使用www.example.com的动画Duration.zero:https://github.com/flutter/flutter/issues/29844

相关问题