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