当前位置: 首页 > news >正文

在Flutter上如何实现按钮的拖拽效果

1、使用 Draggable 和 DragTarget 配合一起使用

Draggable 定义可拖拽对象和拖动时,拖动对象的样子

DragTarget 定义拖拽后接收对象,可拿到Draggable携带的数据

import 'package:flutter/material.dart';class Test extends StatefulWidget {const Test({super.key});@overrideState<Test> createState() => _TestState();
}class _TestState extends State<Test> {Color curColor = Colors.orange;@overrideWidget build(BuildContext context) {return Column(children: [Draggable<Color>(data: Colors.blue,feedback: Container(width: 50,height: 50,color: Colors.blue,),child: Container(width: 50,height: 50,color: Colors.blue,),),Draggable<Color>(data: Colors.yellow,feedback: Container(width: 50,height: 50,color: Colors.yellow,),child: Container(width: 50,height: 50,color: Colors.yellow,),),Draggable<Color>(data: Colors.red,feedback: Container(width: 50,height: 50,color: Colors.red,),child: Container(width: 50,height: 50,color: Colors.red,),),DragTarget<Color>(onAcceptWithDetails: (DragTargetDetails c) {print(c);setState(() {curColor = c.data as Color;});},builder: (context, _, __) {return Container(width: 50,height: 50,color: curColor,alignment: Alignment.center,child: const Text('拖放到这里'),);},),],);}
}

特点​:

  • 支持拖拽数据传递(通过data参数)。
  • 提供完整的拖拽生命周期回调(如onDragStartedonDragEnd

方式二:利用GestureDetector 的onPanUpdate函数来监听 移动

import 'package:flutter/material.dart';class DraggableButton extends StatefulWidget {const DraggableButton({super.key});@overrideState<DraggableButton> createState() => _DraggableButtonState();
}class _DraggableButtonState extends State<DraggableButton> {Offset _offset = Offset.zero;@overrideWidget build(BuildContext context) {return SizedBox(width: double.infinity,height: 400,child: Stack(children: [Positioned(left: _offset.dx,top: _offset.dy,child: GestureDetector(onPanUpdate: (details) {setState(() {_offset += details.delta; // 更新偏移量});},child: FloatingActionButton(onPressed: () {},child: const Icon(Icons.drag_handle),),),),],),);}
}

第三、使用第三方库

flutter_draggable_gridview | Flutter package

draggable_float_widget | Flutter package

draggable_home | Flutter package

相关文章:

  • SQL 索引优化指南:原理、知识点与实践案例
  • cocos creator 3.8 下的 2D 改动
  • C++的历史与发展
  • 特征偏移、标签偏移、数量偏移、概念漂移分别是什么?
  • 共享代理IP带宽受限影响大吗
  • 【经验总结】【乘法替换方法】
  • 无线定位之四 SX1302 网关源码 thread_jit 线程详解
  • Linux文件编程——标准库函数(fopen等)和系统调用函数(open等)的区别
  • 51c嵌入式~电路~合集27
  • 多目应用:三目相机在汽车智能驾驶领域的应用与技术创新
  • 基于智能家居项目 实现DHT11驱动源代码
  • Java——集合基础
  • 虹科干货 | CAN XL安全实践:深度防御下的密钥协商优化
  • AI+企业应用级PPT生成(实战)
  • 如何将两台虚拟机进行搭桥
  • BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(上)
  • Python | Dashboard制作
  • 关于 ast: Babel AST 全类型总览
  • #跟着若城学鸿蒙#HarmonyOS NEXT学习之Blank组件详解
  • C语言—再学习(数据的存储类别)
  • 姚洋将全职加盟上海财经大学,担任滴水湖高级金融学院院长
  • 1至4月全国铁路完成固定资产投资1947亿元,同比增长5.3%
  • 鄂州:锁死中小学教师编制总量,核减小学编制五百名增至初中
  • 巴基斯坦外长:印巴停火
  • 习近平圆满结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 欧盟决意与俄罗斯能源彻底决裂之际,美国谋划新生意:进口俄气对欧转售