Как сохранить состояние виджета при изменении их порядка с помощью 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, а затем переместив все мои переменные, которые я хочу отслеживать, в этот класс. Итак, теперь у меня есть два списка: один для моих виджетов в переупорядочиваемом списке, а другой - для их состояний. Я до сих пор думаю, что это потертости. Если у виджета в моем списке есть дополнительные собственные дочерние элементы, мне нужно будет создать отдельные классы состояния для каждого из них, которые в нем нуждаются, и где-нибудь их сохранить. Это может стать очень запутанным и очень быстро.

0 ответов

Другие вопросы по тегам