通过Draggable&DragTarget重新排序小部件状态时,如何保持它们的状态?

时间:2020-06-10 16:51:00

标签: flutter draggable statefulwidget reorderable-list dragtarget

我正在使用此reorderables软件包。该软件包的工作原理是通过列出一系列子小部件来完成,每个子小部件都用Draggable包装并放在DragTarget内。在此之前,将孩子的键分配给GlobalObjectKey
创建dragTarget之后,会将其分配(或重建?)到KeyedSubTree

dragTarget = KeyedSubtree(key:keyIndexGlobalKey,child:dragTarget);

根据程序包源代码中的注释,这将在被拖动时保留子窗口小部件的状态(toWrap):

///我们将toWrapWithGlobalKey传递到Draggable中,以便在出现列表时
//拖动项目,可访问性框架可以保留所选的
//拖动项的状态。
最终的GlobalObjectKey keyIndexGlobalKey = GlobalObjectKey(toWrap.key);

重新排序本身不是通过DragTarget接受拖动到其中的Draggable发生的,而是通过在每个子对象周围使用DragTarget来获取Draggable悬停在当前位置的索引。放开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更改为红色。在小部件上开始拖动的那一刻,它会重新构建并默认为初始状态(至少是Draggable反馈是)。重新排序后,它保持不变,并且小部件仍处于默认状态。

我的计划是要列出不同的自定义小部件,用户可以在其中修改其内容,如果用户对顺序不满意,可以拖动这些小部件并重新排列。

我的问题是:如何保留小部件的状态?

我正在考虑为每个具有所有状态相关变量的窗口小部件创建一个类,并使用该类来构建我的窗口小部件,但这似乎很肿,而且并不是真正的扑朔迷离。那不应该是StatefulWidget状态的作用吗?

编辑:
因此,我通过使用ChangeNotifier为窗口小部件状态创建了一个附加类,然后将要跟踪的所有变量移入该类来解决了我的问题。因此,我现在基本上有两个列表,一个用于可重排序列表中的小部件,另一个用于其状态。我仍然认为这有点不足。如果列表中的小部件有其自己的其他子级,则需要为每个需要它的小部件创建单独的状态类,并将它们保存在某个地方。这会变得非常混乱,很快。

0 个答案:

没有答案
相关问题