微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter:在屏幕上拖动小部件不是拖放

如何解决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,],);
  }
}

Drag Widgets across screen

解决方法

  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 举报,一经查实,本站将立刻删除。