我正在使用一个“不可接受”项目列表,希望在一个方向上滑动删除项目,但在另一个方向上滑动启动项目编辑。然而,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');
}
},
...
3条答案
按热度按时间cwtwac6a1#
您可以使用
Dismissible
小部件的confirmDismiss
功能来实现此目的。如果您不希望小部件被关闭,那么您只需要从
confirmDismiss
返回false
。不要使用
onDismissed
来进行滑动后处理,使用confirmDismiss
,它会像onDismissed
一样提供滑动方向。以下是
confirmDismiss
函数的官方文档:让应用有机会确认或否决待处理的驳回。如果返回的Future完成为true,则此小部件将被关闭,否则将被移回其原始位置。如果返回的Future完成为false或null,则[onResize]
这里有一个例子:
omjgkv6w2#
Dismissible
将认为您的项目被驳回,只要项目键更改。假设你的物品类别是MyItem
。如果你在MyItem
类中实现了一个构造函数MyItem.from
,它复制了字段,例如:然后,您可以用
handleUndo(new MyItem.from(item))
替换handleUndo(item)
,这样您的new ObjectKey(item)
将不同于您之前使用的旧ObjectKey
(假设您没有在MyItem
上实现operator ==
)。vc6uscn93#
确认解散你仍然留在动画地狱...推荐查看Flutter核心问题,它旨在使用www.example.com的动画Duration.zero:https://github.com/flutter/flutter/issues/29844