我对可拖动项有奇怪的行为。
每次我将其拖动到堆栈上时,它都会从放置位置下降约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
答案 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);
修改:
让您的Positioned
作为Stack
的子代。
用我的替换
onDraggableCanceled: (velocity, offset) {
setState(() {
RenderBox renderBox = context.findRenderObject();
_position = renderBox.globalToLocal(offset);
});
},