可拖动项目总是下降约 80px

Dav*_*vid 4 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'),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

有人明白发生了什么事吗?

另外,有没有办法在拖动项目时能够实时看到 x 和 y 坐标?

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

Cop*_*oad 5

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

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

Total = 80 px
Run Code Online (Sandbox Code Playgroud)

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

RenderBox referenceBox = context.findRenderObject();
Offset localPosition = referenceBox.globalToLocal(yourGlobalOffset);
Run Code Online (Sandbox Code Playgroud)

编辑:

  1. 让你Positioned成为 的孩子Stack

  2. 把你的换成我的

    onDraggableCanceled: (velocity, offset) {
      setState(() {
        RenderBox renderBox = context.findRenderObject();
        _position = renderBox.globalToLocal(offset);
      });
    },
    
    Run Code Online (Sandbox Code Playgroud)