Как сохранить состояние виджета при изменении их порядка с помощью Draggable& DragTarget?
Я использую этот пакет для переупорядочивания. Этот пакет работает за счет наличия списка дочерних виджетов, каждый из которых заключен в Draggable и помещен внутрь DragTarget. Перед этим дочерний ключ назначается GlobalObjectKey.
После создания dragTarget он назначается (или перестраивается?) В KeyedSubTree:
dragTarget = KeyedSubtree(ключ: keyIndexGlobalKey, дочерний элемент: dragTarget);
Согласно комментариям в исходном коде пакета, это должно сохранить состояние дочерних виджетов (toWrap) при перетаскивании:
// Мы передаем toWrapWithGlobalKey в Draggable, чтобы при
перетаскивании // элемента списка структура специальных возможностей могла сохранить
// выбранное состояние перетаскиваемого элемента.
final GlobalObjectKey keyIndexGlobalKey = GlobalObjectKey (toWrap.key);
Само переупорядочение происходит не тогда, когда DragTarget принимает перетаскиваемый объект, а, скорее, с помощью DragTarget вокруг каждого дочернего элемента, чтобы получить индекс текущей позиции, над которой перетаскивается объект. Когда Draggable отпущен, будет вызвана функция изменения порядка, которая удаляет виджет (который перетаскивался) из списка и вставляет его в новую позицию.
Теперь возникает моя проблема: состояние виджета не сохраняется. Я сделал простой TestWidget, чтобы проверить это:
class TestWidget extends StatefulWidget{
@override
_TestWidgetState createState() => _TestWidgetState();
}
class _TestWidgetState extends State<TestWidget> {
Color boxColor;
@override
void initState() {
super.initState();
boxColor= Colors.blue;
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Container(
decoration: BoxDecoration(color: boxColor),
child: Text("Test"),
),
FlatButton(
onPressed: (){
setState(() {
boxColor = Colors.red;
});
},
padding: EdgeInsets.all(8.0),
child: Text("Change to Red"),
color: Colors.grey,
)
],
);
}
}
У этого виджета есть Контейнер с начальным синим фоном (boxColor) и кнопка. Когда кнопка нажата, цвет boxColor изменится на красный. В момент начала перетаскивания виджета он перестраивается и по умолчанию возвращается в исходное состояние (по крайней мере, есть обратная связь "Перетаскивание"). После переупорядочения это не меняется, и виджет все еще находится в состоянии по умолчанию.
Мой план здесь состоит в том, чтобы иметь список различных настраиваемых виджетов, где пользователь может изменять их содержимое, и, если они не удовлетворены порядком, они могут перетаскивать эти виджеты и переставлять их.
У меня вопрос: как сохранить состояние виджетов?
Я подумываю создать класс для каждого виджета со всеми переменными, относящимися к состоянию, и использовать его для создания своих виджетов, но это кажется очень раздутым и на самом деле не в духе флаттера. Разве это не роль состояния StatefulWidget?
РЕДАКТИРОВАТЬ:
Итак, я решил свою проблему, создав дополнительный класс для состояния моего виджета с помощью ChangeNotifier, а затем переместив все мои переменные, которые я хочу отслеживать, в этот класс. Итак, теперь у меня есть два списка: один для моих виджетов в переупорядочиваемом списке, а другой - для их состояний. Я до сих пор думаю, что это потертости. Если у виджета в моем списке есть дополнительные собственные дочерние элементы, мне нужно будет создать отдельные классы состояния для каждого из них, которые в нем нуждаются, и где-нибудь их сохранить. Это может стать очень запутанным и очень быстро.