如何解决Flutter:在屏幕上拖动小部件不是拖放
我只想在屏幕上拖动小部件,而不是拖放。
但是,每当我离开它并再次开始拖动时,它就会从它开始的位置开始受到拖动。好像是reset
。
我的猜测是一次又一次地调用 build,因此它会自动使用 original position values
。我该如何解决?代码应该是什么?
所以换句话说,position
在 (100,100)
结束后被设置为 DragEvent
。然后下一次从 (100,100)
开始拖动,而不是将小部件拖放到最后一个位置。
我也用 GlobalPosition
尝试过,但得到了相同的结果。
这是我的代码:
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
double x1 = 100.0;
double x2 = 200.0;
double y1 = 100.0;
double y2 = 200.0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,title: Text('Drag widget on screen'),),body: Stack(
children: [
Positioned(
left: x1,top: y1,child: GestureDetector(
onHorizontalDragUpdate: (details) {
setState(() {
x1 = details.localPosition.dx;
y1 = details.localPosition.dy;
});
},child: Container(
width: 64,height: 64,color: Colors.Amber,Positioned(
left: x2,top: y2,child: GestureDetector(
onHorizontalDragUpdate: (details) {
setState(() {
x2 = details.localPosition.dx;
y2 = details.localPosition.dy;
});
},color: Colors.red,],);
}
}
解决方法
double x1 = 100.0,x2 = 200.0,y1 = 100.0,y2 = 200.0,x1Prev = 100.0,x2Prev = 200.0,y1Prev = 100.0,y2Prev = 100.0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,title: Text('Drag widget on screen'),),body: Stack(
children: [
Positioned(
left: x1,top: y1,child: GestureDetector(
onPanDown:(d){
x1Prev = x1;
y1Prev = y1;
},onPanUpdate: (details) {
setState(() {
x1 = x1Prev + details.localPosition.dx;
y1 = y1Prev + details.localPosition.dy;
});
},child: Container(
width: 64,height: 64,color: Colors.amber,Positioned(
left: x2,top: y2,child: GestureDetector(
onPanDown:(d){
x2Prev = x2;
y2Prev = y2;
},onPanUpdate: (details) {
setState(() {
x2 = x2Prev + details.localPosition.dx;
y2 = y2Prev + details.localPosition.dy;
});
},color: Colors.red,],);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。