Flutter实现可拖拽操作Draggable

文章目录
- 1. `Draggable` 控件的构造函数
- 主要参数:
- 2. `Draggable` 的工作原理
- 3. 常见用法
- 示例 1:基本的拖拽控件
- 解释:
- 示例 2:与 `DragTarget` 配合使用
- 解释:
- 4. `Draggable` 的回调详解
- 5. 总结
Draggable 是 Flutter 中一个用来实现拖拽功能的控件。它允许用户将一个控件拖动到屏幕的不同位置,并且可以与
DragTarget 控件一起工作来完成拖拽交互。
Draggable 控件不仅可以在应用内拖动控件,还可以处理拖拽反馈、拖拽过程中控件的状态变更等操作。
1. Draggable 控件的构造函数
Draggable<T>({Key? key,required T data, // 传递的拖拽数据required Widget child, // 拖拽控件本身的显示Widget? feedback, // 拖拽过程中展示的控件(通常是透明的)Widget? childWhenDragging, // 拖拽时原控件的替代显示Axis? axis, // 指定拖拽方向(水平或垂直)bool? ignorePointer, // 是否忽略手势bool? dragAnchorStrategy, // 自定义拖拽时锚点位置bool? onDragStarted, // 拖拽开始时的回调bool? onDragEnd, // 拖拽结束时的回调bool? onDraggableCanceled, // 拖拽取消时的回调
})
主要参数:
data:拖拽的核心数据,当用户拖拽控件时会携带此数据(可以是任意类型)。child:正常显示的控件。它是拖拽对象的原始显示(例如,可以是一个文本或图像)。feedback:拖拽时展示的控件,通常是半透明的,这个控件在拖拽期间会悬浮在用户的手指上方。childWhenDragging:当控件被拖拽时,原控件的替代显示(通常是空白或一个灰色的占位符)。axis:控制拖拽的方向,值可以是Axis.horizontal(水平)或Axis.vertical(垂直),也可以为Axis.none(没有方向限制)。ignorePointer:是否忽略手势。如果为true,该控件在拖拽时将无法响应任何手势。onDragStarted:拖拽开始时的回调,通常用来更新状态或做一些准备工作。onDragEnd:拖拽结束时的回调,通常用来处理拖拽结束后的逻辑。onDraggableCanceled:当拖拽被取消时的回调,通常是当控件离开了任何DragTarget区域。
2. Draggable 的工作原理
Draggable 控件主要通过 data 属性将需要拖拽的数据传递给其他控件,特别是 DragTarget,在用户拖拽控件时,Draggable 控件会自动执行以下操作:
- 拖拽开始:当用户开始拖拽时,
Draggable控件会展示指定的feedback,并且显示出原始控件的占位符(childWhenDragging)。 - 拖拽过程:拖拽过程中,用户可以将控件在屏幕上拖动,通常会通过
onDragStarted和onDragEnd回调来触发相应的逻辑。 - 拖拽结束或取消:当拖拽对象被放置到
DragTarget中,或者当用户取消拖拽时,Draggable会触发onDragEnd或onDraggableCanceled回调。
3. 常见用法
示例 1:基本的拖拽控件
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Draggable Example')),body: Center(child: Draggable<int>(data: 100, // 拖拽的数据child: Container(padding: EdgeInsets.all(16),color: Colors.blue,child: Text('Drag me'),),feedback: Material(color: Colors.transparent,child: Container(padding: EdgeInsets.all(16),color: Colors.blue.withOpacity(0.5),child: Text('Dragging'),),),childWhenDragging: Container(padding: EdgeInsets.all(16),color: Colors.grey,child: Text('Gone'),),),),),);}
}
解释:
- 在此例中,
Draggable<int>创建了一个可以拖拽的蓝色矩形,其内容是文本“Drag me”。 - 当用户开始拖拽时,
feedback使矩形变成一个半透明的版本(显示文本“Dragging”),同时,原始控件会被替换为一个灰色的占位符(childWhenDragging)。
示例 2:与 DragTarget 配合使用
import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Draggable with DragTarget')),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Draggable<String>(data: "Hello, Flutter!", // 拖拽的数据child: Container(color: Colors.blue,padding: EdgeInsets.all(20),child: Text('Drag me'),),feedback: Material(color: Colors.transparent,child: Container(color: Colors.blue.withOpacity(0.5),padding: EdgeInsets.all(20),child: Text('Dragging'),),),childWhenDragging: Container(padding: EdgeInsets.all(20),color: Colors.grey,child: Text('Gone'),),),SizedBox(height: 50),DragTarget<String>(onAccept: (data) {ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('Dropped: $data')),);},builder: (context, candidateData, rejectedData) {return Container(width: 300,height: 200,color: Colors.orange,child: Center(child: Text('Drop Here')),);},),],),),),);}
}
解释:
- 在这个例子中,
Draggable<String>允许用户拖拽一个带有文本“Drag me”的蓝色矩形。 - 拖拽过程中,
feedback显示一个半透明的矩形,childWhenDragging在原位置展示一个灰色占位符。 DragTarget<String>用来接收拖拽的字符串数据,当用户将拖拽对象放入目标区域时,显示一个 SnackBar,告知接收到的内容。
4. Draggable 的回调详解
onDragStarted:在拖拽开始时调用。通常用来执行一些初始操作,例如更新 UI 状态,或者记录拖拽开始时的时间等。onDragEnd:在拖拽结束时调用。可以根据拖拽结束的位置来执行不同的操作,比如更新模型数据、界面重绘等。onDraggableCanceled:当拖拽操作被取消时调用,例如当拖拽控件未被放置到DragTarget中。你可以使用这个回调恢复控件的状态,或者清除一些临时的数据。
5. 总结
Draggable是 Flutter 中实现拖拽功能的核心控件,可以创建可拖拽的控件并将其与DragTarget配合使用,实现丰富的拖拽交互。- 它支持拖拽过程中控件状态的变化,如显示拖拽的反馈内容、替代显示、拖拽过程中展示的内容等。
- 通过回调函数如
onDragStarted、onDragEnd和onDraggableCanceled,你可以在不同的拖拽阶段进行更多定制化的操作。
结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!
相关文章:
Flutter实现可拖拽操作Draggable
文章目录 1. Draggable 控件的构造函数主要参数: 2. Draggable 的工作原理3. 常见用法示例 1:基本的拖拽控件解释:示例 2:与 DragTarget 配合使用解释: 4. Draggable 的回调详解5. 总结 Draggable 是 Flutter 中一个用…...
Vue BPMN Modeler流程图
1、参考地址 git clone https://github.com/evanyangg/vue-bpmn-modeler.git 2、安装bpmn.js npm install bpmn-js --save 3、使用bpmn.js <template><div class"containers"><div class"canvas" ref"canvas"></div&g…...
写在公司40周年前夕
日子太快了,来这里工作六年多了。现在才知道原来入职的公司只是母公司的一小点。刚来一年就碰到疫情,三年疫情之后就迎来亏损,而后就是变了董事长,换了总经理。 这圣诞前,所有的子分又换了一把手。动作之大,…...
Python调用Elasticsearch更新数据库
文章目录 Elasticsearch介绍Python调用Elasticsearch更新数据库 Elasticsearch介绍 Elasticsearch是一个基于Lucene的搜索引擎,它提供了一个分布式、多租户能力的全文搜索引擎,具有HTTP web接口和无模式的JSON文档。Elasticsearch是用Java开发的&#x…...
测试基础之测试分类
软件测试是确保软件产品满足预期功能、性能和用户体验要求的关键环节。它的主要目的是通过系统化的方法发现并修复软件中的缺陷,从而提高软件的质量和可靠性。在软件开发生命周期的不同阶段执行测试,以尽早发现潜在的错误或类型,早期发现缺陷…...
太阳能LED路灯智能控制系统(论文+源码)
1系统的功能及方案设计 本次课题为太阳能LED路灯智能控制系统,其系统整体架构如图2.1所示,太阳能板通过TP4056充电模块给锂电池进行充电,电池通过HX3001升压模块进行升压到5V给整个控制系统进行供电,控制系统由AT89C52单片机作为…...
文本数据处理
文本数据处理 一、数据转换与错误处理 (一)运维中的数据转换问题 在计算机审计及各类数据处理场景中,数据转换是关键步骤,涉及将被审计单位或其他来源的数据有效装载到目标数据库,并明确标示各表及字段含义与关系。…...
Liunx环境下安装人大金仓数据库V8R6版本
Liunx环境下安装人大金仓数据库V8R6版本 一:硬件环境要求二:软件环境要求三:安装包准备四:检测和配置环境4.1:检查操作系统信息4.2 检查系统内存与存储空间 五:配置内核参数六:预安装工作6.1 创…...
Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3)
Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3) import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas impor…...
python 怎么引入类
一、导入单个类 from fun import Dog dogDog(husike) dog.bark() 二、导入多个类 多个类之间用逗号分隔 from fun import Dog,Cat dogDog(husike) dog.bark() catCat(maomi) cat.catch_mouse() 三、导入整个模块 import fun dogfun.Dog(husike) dog.bark() catfun.Cat(maomi) …...
Day35汉明距离
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。 给你两个整数 x 和 y,计算并返回它们之间的汉明距离。 class Solution {public int hammingDistance(int x, int y) {int cnt 0;while (Math.max(x, y) ! 0) {if ((x & 1) ! (y &…...
中文学习系统:客户服务与学习支持
3.1 系统可行性分析 开发一款程序软件不仅需要时间,也需要人力,物力资源。而进行可行性分析这个环节就是解决用户这方面的疑问,看看程序在当前的条件下是否可以进行开发。 3.1.1 技术可行性分析 此程序选用的开发语言是Java,这种编…...
华为麦芒5(安卓6)termux记录 使用ddns-go,alist
下载0.119bate1版,不能换源,其他源似乎都用不了,如果root可以直接用面具模块 https://github.com/termux/termux-app/releases/download/v0.119.0-beta.1/termux-app_v0.119.0-beta.1apt-android-5-github-debug_arm64-v8a.apk 安装ssh(非必要) pkg install openssh开启ssh …...
餐厅下单助手系统(Java+MySQL)
项目概览 餐厅下单助手系统是一个采用 Java 实现的小型食品订单管理系统,并且以 SwingUI 打造视觉界面,数据库提供。本系统分为商家和顾客两类体验,有效地给予简洁性能。可用做课程设计,参考学习。 技术栈 Java: 核心开发语言S…...
Go操作MySQL
连接 Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。 我们常用的数据库基本上都有完整的第三方实现。例如:MySQL驱动 下载依赖…...
Linux(Ubuntu/CentOS)配置开机自启动服务
systemd和systemctl的区别和联系 systemd:是现代Linux系统中的初始化系统和服务管理器。它主要负责系统引导和进程管理,支持并行化启动服务,并提供高级的服务管理和依赖控制。 systemctl:是systemd的命令行工具,用于与…...
springboot3版本结合knife4j生成接口文档
1.概述 knife4j官网为:介绍 | Knife4j (xiaominfo.com)https://doc.xiaominfo.com/docs/introduction 初步了解的码友可以初步了解一下官网的如下几个模块: 其中在快速开始模块中,不同的springboot版本都有一个使用的案例demo如下图位置&am…...
谈谈 Wi-Fi 的 RTS/CTS 设计
我不是专业的 Wi-Fi 技术工作者。但我可以谈谈作为统计复用网络的 Wi-Fi,通用的网络分布式协调功能在底层是相通的。 从一个图展开: 基于这底层逻辑,共享以太网可以用 CSMA/CD,而 Wi-Fi 只能用 CSMA/CA,区别在 CD(冲…...
JVM 详解
一. JVM 内存区域的划分 1. 程序计数器 程序计数器是JVM中一块比较小的空间, 它保存下一条要执行的指令的地址. [注]: 与CPU的程序计数器不同, 这里的下一条指令不是二进制的机器语言, 而是Java字节码. 2. 栈 保存方法中的局部变量, 方法的形参, 方法之间的调用关系. 栈又…...
【debug】
error info: Error response Error response Error code 401. Message: Unauthorized. requests.exceptions.ConnectionError: HTTPConnectionPool(host‘127.0.0.1’, port9000): Max retries exceeded with url: /test/ (Caused by NewConnectionError(‘&l…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
