我们如何动态地在Flutter中的任意位置添加拖放? 这是我尝试实现的。提出修改建议以解决问题或提出适当的解决方案。
我需要解决的问题是canvasItemObj.x和canvasItemObj.y变量是根据dragUpdate更新的。但是小部件的位置未更新。 ( Positioned()小部件的顶部和左侧参数)
这是用于保存窗口小部件及其属性的 CanvasItemProps 类。
class CanvasItemProps {
Widget canvasItem;
double x = 0, y = 0, dx, dy;
double scale = 1;
Color color;
CanvasItemProps();
CanvasItemProps.fromItem(this.canvasItem);
}
canvasItemProps 保存CanvasItemProps的列表
List<CanvasItemProps> canvasItemProps = [];
我有一个平面按钮,其onPressed执行以下操作:
var canvasItemObj = CanvasItemProps();
canvasItemProps.add(canvasItemObj);
canvasItemObj.canvasItem = Positioned(
left: canvasItemObj.x,
top: canvasItemObj.y,
child: GestureDetector(
child: Text(
addTextController.text,
textScaleFactor: 5,
),
onVerticalDragUpdate: (dragDetails) {
setState(() {
canvasItemObj.y = dragDetails.localPosition.dy;
canvasItemObj.x = dragDetails.localPosition.dx;
});
},
));
addTextController.text = "";
setState(() {});
},
在构建函数中有一个堆栈:
Stack(children:canvasItemProps.isEmpty()?
Text("No Item"):
getCanvasItem)
以下 getCanvasItem 函数返回要传递给Stack小部件的小部件列表
List<Widget> getCanvasItem() {
List<Widget> list = [];
for (int i = 0; i < canvasItemProps.length; i++) {
list.add(canvasItemProps[i].canvasItem);
}
return list;
}
另一方面,当我只处理一个未动态添加的小部件时,此方法很好用(x和y是在作用域中声明的两个变量,并且已初始化为0。)
double x=0,y=0;
小工具如下:
Container(
margin: EdgeInsets.fromLTRB(50, 100, 90, 100),
color: Colors.yellow,
child: Stack(
children: <Widget>[
Positioned(
top: y,
left: x,
child: GestureDetector(
onVerticalDragUpdate: (v){
setState(() {
x = v.localPosition.dx;
y = v.localPosition.dy;
});
},
child:Text("Text"),
)
),
],
),
)
答案 0 :(得分:0)
问题是Top和Left参数是最终参数,因此您无法更改值。但是,您应该每次使用更新后的值重新初始化定位的小部件。