Flutter 颤振-在设置状态之前保存多个小部件转换
我有一个包含多个Matrix手势容器的堆栈,其中包含可以拖动、收缩、缩放和旋转的图像。我想将每个容器的状态保存在它的位置和形状中,因为在使用setState进行一点更改后,所有内容都会返回到原始位置。 图像的所有信息都位于具有特定对象类型的列表中。 以下是显示图像的代码片段:Flutter 颤振-在设置状态之前保存多个小部件转换,flutter,dart,matrix,mobile,pinchzoom,Flutter,Dart,Matrix,Mobile,Pinchzoom,我有一个包含多个Matrix手势容器的堆栈,其中包含可以拖动、收缩、缩放和旋转的图像。我想将每个容器的状态保存在它的位置和形状中,因为在使用setState进行一点更改后,所有内容都会返回到原始位置。 图像的所有信息都位于具有特定对象类型的列表中。 以下是显示图像的代码片段: class NewOutfitState extends State<NewOutfit> { List<DisplayGarment> garmentsList; @ov
class NewOutfitState extends State<NewOutfit> {
List<DisplayGarment> garmentsList;
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("New"),
body: new Container(
child:MyList(myList: garmentsList, canvasSize: realCanvas,);
)
}
}
class MyListState extends State<MyList>{
List<DisplayGarment> myList;
double realCanvas;
bool flag=false;
int touch=0;
@override
void initState() {
super.initState();
myList=widget.myList;
realCanvas = widget.canvasSize;
}
@override
Widget build(BuildContext context) {
return Stack(
children: getList(),
);
}
List<Widget> getList(){
List<Widget> listWidget=[];
for(int i=0;i<myList.length;i++) {
final ValueNotifier<Matrix4> notifier1= ValueNotifier(Matrix4.identity());
DisplayGarment _garments = myList[i];
listWidget.add(
MatrixGestureDetector(
key: Key(i.toString()),
onMatrixUpdate: (m, tm, sm, rm) {
notifier1.value = m;
},
child: AnimatedBuilder(
animation: notifier1,
builder: (ctx, child) {
return Transform(
transform: notifier1.value,
child: Stack(
children: <Widget>[
Container(
padding: EdgeInsets.all(4),
alignment: Alignment(0, -0.5),
child:
Container(
padding: EdgeInsets.all(0),
height: imgHeigh,
width: imgWidth,
child:
DottedBorder(
color: Colors.transparent,
strokeWidth: 0,
child: Center(
child: CachedNetworkImage(
imageUrl:
'https://fashiers.com/garments_img/'+imgUrl,
height: imgHeigh,
width: imgWidth,
)),
);
,)
)
],),);},),
)
);
}
return listWidget;
}
类newOutfightState扩展状态{
列表garmentsList;
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(“新”),
主体:新容器(
子项:MyList(MyList:garmentsList,canvasSize:realCanvas,);
)
}
}
类MyListState扩展了状态{
列出我的清单;
双真实画布;
布尔标志=假;
int-touch=0;
@凌驾
void initState(){
super.initState();
myList=widget.myList;
realCanvas=widget.canvasSize;
}
@凌驾
小部件构建(构建上下文){
返回堆栈(
子项:getList(),
);
}
List getList(){
List listWidget=[];
对于(int i=0;i对于第一部分,您不应该将notifier1
初始化放在build函数中。这就是为什么每次使用setStatus
时,您的位置都会重置。该部分应该在initState()
中初始化,这意味着您应该将所有位置值保留在此类中。(例如,列表
)
第二部分,为服装
编制索引可能是本能的解决方案。通过以下方式显示/隐藏边框:
child: _selectedIndex == i ?
// Widget with border
: //Widget without border
并在Matrix Update()中设置\u selectedIndex
非常感谢,我将尝试使用通知程序和列表的解决方案。我唯一没有得到的是_selectedIndex是一个int-var还是一个小部件?它应该是矩阵手势的子元素?在上面的代码中,_selectedIndex
是一个int-var并且可以在类级别定义。因为我看到了关于getList()
函数中使用ode>i,并尝试重用它。您可以定义自己的索引方法。