我创建了一个像这样的可关闭小部件:
GestureDetector(
onHorizontalDragUpdate: (DragUpdateDetails event) {
setState(() {
_offsetX = event.globalPosition.dx;
print("Event : ${event.globalPosition.dx}");
});
},
onHorizontalDragStart: (DragStartDetails event) {
setState(() {
_offsetX = event.globalPosition.dx;
print("Event : ${event.globalPosition.dx}");
});
print(_offsetX.abs());
// }
},
child: Dismissible(
key: UniqueKey(),
direction: DismissDirection.endToStart,
onResize: () {},
onUpdate: (details) {
// });
},
onDismissed: (direction) {},
secondaryBackground: AnimatedContainer(
duration: const Duration(milliseconds: 300),
transform: Matrix4.translationValues(_offsetX - 36, 0.0, 0.0),
color: Colors.red,
padding: const EdgeInsets.only(left: 20),
child: const Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Icon(
Icons.delete,
color: Colors.white,
size: 36,
),
// Add other widgets here that you want to move with the swipe
],
)),
background: Container(
color: DsColors.secondary,
),
confirmDismiss: (direction) async {
final result = await Future.delayed(const Duration(seconds: 6), () {
return false;
});
return result;
},
child: widget.child,
),
)
我想当孩子被交换时,删除 secondaryBackground 里面的图标,像交换孩子一样从右到左移动,但是当我交换孩子时 onHorizontalDragUpdate 不会被触发?
您可以从
onHorizontalDragUpdate
的 GestureDetector
回调中获取类似的拖动更新信息,而不是使用 onUpdate
中的 Dismissible
。
Dismissible(
onUpdate: (details) {
final progress = details.progress;
// ...
}
)
您还需要传递一个在构建调用之间持续存在但对该项目唯一的密钥。您应该使用具有常量值或附加项目标识符的
UniqueKey()
,而不是使用及时构建的 ValueKey
。例如,如果小部件位于 ListView
构建器内,则需要将 index
包含在 ValueKey
的值中:
Dismissible(
key: ValueKey('myItem-$index'),
// ...
)