可拖动项始终下降约80像素

时间:2019-01-12 20:34:51

标签: dart flutter

我对可拖动项有奇怪的行为。

每次我将其拖动到堆栈上时,它都会从放置位置下降约80像素(这是一个近似值,也许对于另一部手机,可能是其他情况)。 x值对我来说似乎还可以。

代码如下:

class GesturePage extends StatefulWidget {
  @override
  _GesturePageState createState() => _GesturePageState();
}

class _GesturePageState extends State<GesturePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Gesture"),
      ),
      body: Stack(
        children: <Widget>[
          DragBox(Offset(0.0, 80.0)),
        ],
      ),
    );
  }
}

class DragBox extends StatefulWidget {
  final Offset initPosition;    
  DragBox(this.initPosition);

  @override
  DragBoxState createState() => DragBoxState();
}

class DragBoxState extends State<DragBox> {
  Offset position = Offset(0.0, 0.0);

  @override
  void initState() {
    super.initState();
    position = widget.initPosition;
  }

  @override
  Widget build(BuildContext context) {
    return Positioned(
      left: position.dx,
      top: position.dy - 80.0,
      child: Draggable(
        data: widget.itemColor,
        child: Container(
          child: Image.asset('images/item.png'),
        ),
        onDraggableCanceled: (velocity, offset) {
          setState(() {
            position = offset;
          });
        },
        feedback: Container(
          child: Image.asset('images/item.png'),
        ),
      ),
    );
  }
}

有人知道发生了什么事吗?

此外,是否有一种方法可以在拖动项目时实时查看x和y坐标?

编辑: 在源代码中查找80.0。这解决了我的问题,但仅适用于一种仿真器类型。还有另一个有趣的代码here

1 个答案:

答案 0 :(得分:2)

是的,事情很简单。 y轴上的80差包括

24 px = For Status bar
56 px = For App bar / Navigation bar

Total = 80 px

那是因为您正在接收全球位置,因此需要将其转换为本地位置。这是您应该做的。

RenderBox referenceBox = context.findRenderObject();
Offset localPosition = referenceBox.globalToLocal(yourGlobalOffset);

修改:

  1. 让您的Positioned作为Stack的子代。

  2. 用我的替换

    onDraggableCanceled: (velocity, offset) {
      setState(() {
        RenderBox renderBox = context.findRenderObject();
        _position = renderBox.globalToLocal(offset);
      });
    },