我正在使用一个允许的项目列表,并希望在一个方向上滑动以删除该项目,但是在另一个方向上滑动以启动项目的编辑。但是,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');
}
},
...
答案 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),
)