flutter 可拖动组件Draggable、接收拖动组件容器DragTarget

梦里梦外; 2021-07-24 23:21 1007阅读 0赞
  1. 可拖动组件
  2. (1)若要组件位置变成拖动后位置,需要配合Positioned组件和Stack组件实现
  3. (2)若只是可以拖动,但最终组件位置不改变,不使用Positioned组件
  4. Draggable(
  5. data:, 拖拽传递的数据,任意类型,对应接收拖动组件的容器的onAccept回调的第一个参数
  6. feedback:拖动过程中的组件,
  7. child: 待拖动的组件,
  8. onDraggableCanceled: (Velocity velocity, Offset offset){
  9. setState(() {
  10. 第二个参数为拖动过程的动态坐标
  11. });
  12. },
  13. )
  14. 接收拖动组件容器
  15. DragTarget(
  16. onAccept:(参数){ 当组件拖动到接收组件触发的函数
  17. 参数为拖动组件data参数的内容
  18. },
  19. builder: (context,candidayeData,rejectedData){ 重写builder组件,返回一个组件
  20. return 接收组件;
  21. },
  22. ),

效果图:
在这里插入图片描述
代码示例:

可拖动组件:

  1. import "package:flutter/material.dart";
  2. class Drag extends StatefulWidget {
  3. //构造器传入坐标和参数
  4. Drag({ Key key,this.offset,this.widgetColor}) : super(key: key);
  5. final Offset offset;
  6. final Color widgetColor;
  7. @override
  8. _DragState createState() => _DragState();
  9. }
  10. class _DragState extends State<Drag> {
  11. Offset offset=Offset(0.0,0.0);
  12. @override
  13. void initState() {
  14. // TODO: implement initState
  15. super.initState();
  16. //获取继承的状态类的数据
  17. offset=widget.offset;
  18. }
  19. @override
  20. Widget build(BuildContext context) {
  21. return Container(
  22. //Positioned实现组件位置为鼠标停止位置
  23. child: Positioned(
  24. left:offset.dx,
  25. top:offset.dy,
  26. child: Draggable(
  27. //拖拽传递的数据
  28. data:widget.widgetColor,
  29. //拖动过程中的组件
  30. feedback:Container(
  31. width: 130,
  32. height: 130,
  33. color: Colors.red,
  34. ) ,
  35. //待拖动组件
  36. child: Container(
  37. width: 100,
  38. height: 100,
  39. color:widget.widgetColor,
  40. ),
  41. //拖动过程回调
  42. onDraggableCanceled: (Velocity velocity, Offset offset){
  43. setState(() {
  44. //第二个参数为拖动的动态坐标
  45. this.offset=offset;
  46. });
  47. },
  48. ),
  49. ),
  50. );
  51. }
  52. }

接收容器组件:

  1. import "package:flutter/material.dart";
  2. import "drag.dart";
  3. void main()
  4. {
  5. runApp(App());
  6. }
  7. class App extends StatelessWidget{
  8. @override
  9. Widget build(BuildContext context) {
  10. // TODO: implement build
  11. return MaterialApp(
  12. home:Scaffold(
  13. appBar:AppBar(
  14. title: Text('小案例'),
  15. ),
  16. body:Home() ,
  17. ),
  18. //去掉右上角的debug贴纸
  19. debugShowCheckedModeBanner: false,
  20. theme: ThemeData(
  21. primarySwatch: Colors.blue
  22. ),
  23. );
  24. }
  25. }
  26. class Home extends StatefulWidget {
  27. @override
  28. _HomeState createState() => _HomeState();
  29. }
  30. class _HomeState extends State<Home> {
  31. Color dragColor=Colors.orange;
  32. @override
  33. Widget build(BuildContext context) {
  34. return Container(
  35. child: Stack(
  36. children: <Widget>[
  37. //拖动组件
  38. Drag(offset: Offset(80,80),widgetColor: Colors.yellow,),
  39. Drag(offset: Offset(180,80),widgetColor: Colors.pink,),
  40. Center(
  41. //拖拽接收组件
  42. child: DragTarget(
  43. //当组件拖动到该组件触发的回调,参数为拖动组件的data数据内容
  44. onAccept:(Color color){
  45. this.dragColor=color;
  46. },
  47. //重写方法,表示待接收的组件
  48. builder: (context,candidayeData,rejectedData){
  49. return Container(
  50. width: 200,
  51. height: 200,
  52. color: this.dragColor,
  53. );
  54. },
  55. ),
  56. )
  57. ],
  58. ),
  59. );
  60. }
  61. }

发表评论

表情:
评论列表 (有 0 条评论,1007人围观)

还没有评论,来说两句吧...

相关阅读