Flutter:在堆栈窗口小部件中动态添加拖放到任何位置的窗口小部件

时间:2019-12-16 08:19:58

标签: android flutter dart

我们如何动态地在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"),
            )
          ),
            ],
          ),
          )

1 个答案:

答案 0 :(得分:0)

问题是Top和Left参数是最终参数,因此您无法更改值。但是,您应该每次使用更新后的值重新初始化定位的小部件。