Я создал закрывающийся виджет следующим образом:
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,
),
)
Я хочу, чтобы при замене дочернего элемента значок внутри вторичного фона перемещался справа налево, как замененный дочерний элемент, но когда я меняю дочерний элемент, onHorizontalDragUpdate не срабатывает?
Раньше я пробовал так: onUpdate: (details) { setState(() { _offsetX = Details.progress * 100; }); } Но когда я добавляю setState, замена не работает и я не могу поменять виджет @DhafinRayhan
Вам необходимо использовать key, который уникален для элемента, но сохраняется между вызовами сборки; поэтому вместо передачи UniqueKey() используйте ValueKey с постоянным значением, например, если ваш виджет находится внутри построителя ListView, используйте его следующим образом: ValueKey('myItem-$index')
Отлично, я перенесу это в ответ





Вместо использования onHorizontalDragUpdate из GestureDetector вы можете получить аналогичную информацию об обновлении перетаскивания из обратного вызова onUpdateDismissible.
Dismissible(
onUpdate: (details) {
final progress = details.progress;
// ...
}
)
Вам также потребуется передать ключ, который сохраняется между вызовами сборки, но является уникальным для элемента. Вместо использования UniqueKey(), созданного во времени, вы должны использовать ValueKey с постоянным значением или с добавлением идентификатора элемента. Например, если виджет находится внутри конструктора ListView, вам нужно будет включить index в значение ValueKey:
Dismissible(
key: ValueKey('myItem-$index'),
// ...
)
Для чего вам нужен
_offsetX? Разве вы не должны иметь возможность вывести значениеdxиз свойства ProgressDismissUpdateDetails, которое получается из обратного вызоваDismissibleonUpdate?