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

时间:2017-08-28 12:36:15

标签: dart flutter

我正在使用一个允许的项目列表,并希望在一个方向上滑动以删除该项目,但是在另一个方向上滑动以启动项目的编辑。但是,Flutter坚持必须在onDismissed回调中从树中删除Dismissible项。我尝试重新插入该项目,但这不起作用。有任何想法吗?从创建列表项的代码中提取如下:

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

2 个答案:

答案 0 :(得分:3)

只要商品密钥发生变化,Dismissible就会认为您的商品已被解雇。假设您的商品类为MyItem。如果在MyItem.from类中实现了复制字段的构造函数MyItem,例如:

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)),这样您的new ObjectKey(item)将与之前使用的旧版ObjectKey不同(假设您未实现operator == MyItem 1}} <?php include("nav.php"); ?> }。

答案 1 :(得分:0)

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

如果您不希望窗口小部件被关闭,则只需从false返回confirmDismiss

请勿使用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),
)