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