前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载flet.DragTargetLeaveEvent是 Flet 拖放Drag Drop体系中DragTarget.on_leave回调所携带的事件载荷类它用于在用户将一个Draggable控件拖离某个DragTarget的有效区域时向开发者传递谁被拖走了以及从哪个目标上离开等信息。本文以 dragtargetleaveevent.md 所对应的 API 参考为主体结合 Flet 源码中的类定义、事件基类与官方示例完整讲解该事件类的字段含义、触发时机、底层解析逻辑并给出可直接运行的实战代码。一、DragTargetLeaveEvent是什么在 Flet 中拖放交互由一对控件配合完成可被拖拽的 Draggable 和接受放置的 DragTarget。一次完整的拖放会触发多个回调其中DragTarget.on_leave专门负责拖拽物离开目标区域这一瞬间而它的回调参数类型正是DragTargetLeaveEvent。从源码定义看该类继承自 Flet 的事件基类Event并泛型绑定到DragTargetdataclass class DragTargetLeaveEvent(Event[DragTarget]): Event payload for :attr:flet.DragTarget.on_leave. 该定义位于 drag_target.py与DragTargetEvent、DragWillAcceptEvent一起被声明为DragTarget相关事件的载荷类型。也就是说当你在DragTarget上绑定on_leave回调时Flet 运行时传入的参数就是一个DragTargetLeaveEvent实例。二、事件字段详解src_id与srcDragTargetLeaveEvent的全部载荷只有两个字段它们的职责非常聚焦——回答被拖离的是哪一个源控件字段类型说明src_idOptional[int]被拖拽的Draggable源控件的内部 ID若不可用则为NonesrcDraggable由src_id解析得到的Draggable控件实例可直接访问其属性其中src并不是随事件数据一同传输的而是在事件对象构造完成后通过__post_init__动态解析出来的def __post_init__(self): if self.src_id is not None: self.src cast(Draggable, self.page.get_control(self.src_id))这段逻辑说明两件事事件只携带 ID不携带完整对象Flet 的跨端事件协议Python 后端与 Flutter 客户端之间传输的是轻量的src_id避免序列化整个控件树src是便捷访问器只要src_id有效src就会通过page.get_control()在页面控件树中查回对应的Draggable实例让你在回调里直接读写源控件例如读取src.content、src.group。需要特别注意的是src_id是Optional类型。如果事件系统未能解析出源控件 ID例如来源信息缺失src_id为None此时src字段不会被赋值。因此在实际回调中访问e.src之前建议先对e.src_id做判空保护。三、继承自Event的通用成员作为 Flet 1.0 类型化事件体系的一部分DragTargetLeaveEvent还从 Event 基类继承了四个通用成员它们在所有事件回调中一致可用成员类型说明namestr事件名称dataOptional[Any]可选的事件原始载荷数据controlDragTarget触发本事件的控件即目标DragTarget本身pagePage属性事件源控件所属的页面targetint属性触发事件的控件的内部 ID等价于control._i在DragTargetLeaveEvent场景中e.control就是被离开的那个DragTarget这使回调可以方便地修改目标的外观来恢复原状。e.page属性在事件源控件尚未挂载到页面时会抛出RuntimeError这是官方有意设计的约束。四、触发时机DragTarget.on_leave与拖放状态机DragTargetLeaveEvent的唯一绑定入口是DragTarget.on_leaveon_leave: Optional[EventHandler[DragTargetLeaveEvent]] None Called when a :class:~flet.Draggable leaves this target. 结合 DragTarget 的完整事件集可以还原 Flet 拖放交互的完整生命周期拖拽物进入目标区域 →on_will_accept载荷为DragWillAcceptEvent携带accept判断结果拖拽物在目标区域内移动 →on_move载荷为DragTargetEvent携带本地/全局坐标拖拽物离开目标区域 →on_leave载荷为DragTargetLeaveEvent用户在目标上松手完成放置 →on_accept载荷为DragTargetEvent。一个关键前提只有当Draggable与DragTarget属于同一个group默认值为default时目标才会接受进入的拖拽物。on_leave只会在已经进入过目标区域之后再离开时触发从未进入就直接划过目标是不会触发on_leave的。五、实战示例拖离目标后恢复边框状态下面这段代码来自仓库中的官方示例 drag_and_drop_containers/main.py它完整展示了DragTargetLeaveEvent的典型用途——在拖拽物进入目标时高亮边框、离开时恢复默认外观import flet as ft def main(page: ft.Page): def handle_drag_will_accept(e: ft.DragWillAcceptEvent): e.control.content.border ft.Border.all( 2, ft.Colors.BLACK_45 if e.accept else ft.Colors.RED, ) e.control.update() def handle_drag_accept(e: ft.DragTargetEvent): e.control.content.bgcolor e.src.content.bgcolor e.control.content.border None e.control.update() def handle_drag_leave(e: ft.DragTargetLeaveEvent): e.control.content.border None e.control.update() page.add( ft.SafeArea( contentft.Row( controls[ ft.Column( controls[ ft.Draggable( groupcolor, contentft.Container( width50, height50, bgcolorft.Colors.CYAN, border_radius5, ), content_feedbackft.Container( width20, height20, bgcolorft.Colors.CYAN, border_radius3, ), ), ft.Draggable( groupcolor, contentft.Container( width50, height50, bgcolorft.Colors.YELLOW, border_radius5, ), ), ft.Draggable( groupcolor, contentft.Container( width50, height50, bgcolorft.Colors.GREEN, border_radius5, ), ), ], ), ft.Container(width100), ft.DragTarget( groupcolor, on_will_accepthandle_drag_will_accept, on_accepthandle_drag_accept, on_leavehandle_drag_leave, contentft.Container( width50, height50, bgcolorft.Colors.BLUE_GREY_100, border_radius5, ), ), ], ), ) ) if __name__ __main__: ft.run(main)在这个示例中handle_drag_leave展示了DragTargetLeaveEvent的两个核心使用要点通过e.control定位目标e.control就是被离开的DragTarget这里通过e.control.content拿到其内部的Container并清除进入时设置的边框调用e.control.update()推送变更Flet 采用变更后手动更新的模型修改属性后必须调用update()才能让 Flutter 客户端渲染最新状态。如果业务上还需要知道是谁离开了则使用e.src_id/e.src。例如可以在离开时读取e.src.group做分组判断或读取e.src.content的属性记录拖拽物的信息。六、Flet 1.0 迁移注意事项如果你从 Flet 0.28 及更早版本升级需要注意DragTargetLeaveEvent是 1.0 类型化事件体系的一部分。根据仓库中的 migrate-to-1-0.md 说明旧版回调中通过e.data读取原始字符串载荷1.0 起改为读取类型化字段e.src_idDragTarget.on_leave现在接收DragTargetLeaveEvent请使用e.src_id替代e.data事件处理器可以声明为零参数或单参数两种形式单参数形式接收的就是对应的事件对象类型化事件统一写作ft.Event[ft.Button]的形式DragTargetLeaveEvent同样遵循该约定Event[DragTarget]。七、源码级原理从src_id到src的解析链理解DragTargetLeaveEvent的底层机制需要回到 Flet 的事件分发架构。src_id由 Flutter 客户端在拖放手势结束时随事件协议回传Python 端收到后构造事件对象而__post_init__中的self.page.get_control(self.src_id)依赖 Event.page 属性定位页面再通过页面控件树反查控件实例。这个设计带来的直接好处是事件对象本身是轻量的数据载体dataclass不持有对控件树的强引用快照控件实例始终以页面中的实时状态为准。因此在on_leave回调中通过e.src读取到的永远是控件的最新属性不会出现事件快照与 UI 状态不一致的问题。从源码结构还可以推断DragTargetEvent与DragWillAcceptEvent采用了完全相同的src_id → src解析模式见 drag_target.py这说明该模式是DragTarget家族事件的统一约定。八、与其他拖放事件的对比速查事件载荷类对应回调关键字段触发时机DragWillAcceptEventon_will_acceptaccept、src_id、src拖拽物进入目标区域时DragTargetEventon_move/on_acceptsrc_id、src、local_position、global_position目标内移动 / 成功放置时DragTargetLeaveEventon_leavesrc_id、src拖拽物离开目标区域时DragTargetLeaveEvent是三者中载荷最精简的一个——它不携带坐标信息只关心离开这一行为本身及其来源适合用来清理on_will_accept中设置的视觉反馈状态如移除高亮边框、还原背景色等。九、小结flet.DragTargetLeaveEvent是 Flet 拖放机制中离开目标这一环节的标准事件载荷字段精炼、语义清晰通过e.src_id/e.src获取被拖离的源控件通过e.control定位并更新被离开的目标控件与on_will_accept、on_move、on_accept共同构成完整的拖放状态机1.0 起使用类型化字段替代旧的e.data字符串载荷。掌握它的用法你就可以在 Flet 应用中实现悬停高亮、离开还原、放置生效这类丝滑的拖放交互体验。完整可运行的示例可在 drag_and_drop_containers/main.py 中查看对应的控件级文档见 dragtarget.md。赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐Flet 事件详解DismissibleUpdateEvent 拖拽更新事件的结构、字段与实战用法Flet 事件详解DismissibleUpdateEvent 拖拽更新事件的结构、字段与实战用法 DismissibleUpdateEvent 是 Flet前端跨平台桌面应用移动开发DINOv2 选型实战4 种规格怎么选才不踩坑DINOv2 选型实战4 种规格怎么选才不踩坑 你要把视觉特征接进分类流水线翻到 DINOv2 从 ViT S/14 到 ViT g/14 的四种规格时卡住前端跨平台桌面应用移动开发Flet 拖拽结束事件 DragEndEventPython 侧完整回调载荷与源码实现剖析Flet 拖拽结束事件 DragEndEventPython 侧完整回调载荷与源码实现剖析 拖拽手势Drag/Pan是 Flutter 移动与桌面应用中最前端跨平台桌面应用移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
模式与模式匹配:现代语言如何用数据形状替代if-else 教材里那一章往往被放在书的后半部分,甚至有人直接跳过——“模式与模式匹配”,听起来像是给编译器作者准备的内容。但这两年你会发现,C# 9 的 switch 表达式、Java 21 的 switch 模式匹配、Python 3.10 的 match-case,全都在往这… · 2026/9/24 19:35:24
模式匹配详解:Rust match语法、解构与多语言对比 “模式匹配”这四个字,我第一次看到的时候,以为是某种高大上的设计模式或者架构方案。后来在写 Rust 和 Kotlin 的过程中,才意识到这是一套完全不同的思维工具。它不只是语法糖,更是一种对数据结构的“拆解能力”——让你能用一种… · 2026/9/24 19:35:24
百元蓝牙音箱怎么选?十款主流桌面音箱横评实测 1. 桌面蓝牙音箱怎么选?先搞清楚百元价位的水有多深说实话,这几年每次发评测内容,后台私信里问“一两百块的蓝牙音箱到底能不能买”的人,比问几千块HiFi系统的多得多。大部分人的需求其实特别简单:桌面放一台ÿ… · 2026/9/24 19:35:24
Linux磁盘分区实战:4K对齐、GPT与文件系统参数优化 1. 为什么今天还要亲手分区——一个被低估的底层操作能力“磁盘分区”这四个字,听起来像上世纪90年代DOS系统里的老古董。现在随便买块2TB的SSD,Windows安装向导自动给你分好C盘、恢复分区、EFI系统分区;Mac用户点几下“磁盘工具”就搞定APFS… · 2026/9/24 20:11:57
皮肤癌目标检测数据集实战:从解压到YOLOv8训练 简介:这份资源是一套面向医学影像目标检测任务的高质量皮肤癌数据集,适合计算机视觉研究者、医学AI开发者和目标检测初学者用于模型训练、算法验证与效果对比。包内包含基底细胞癌、黑色素瘤、银屑病、脂溢性角化病等九类常见皮肤病变的标注图像… · 2026/9/24 20:11:57
MySQL入门必备:从关系模型到建库建表与SQL基础实操指南 1. 第一章前两节到底在学什么1.1 整体学习路径与章节安排这份笔记记于2026年3月2日,对应教材第一章的前两节内容。从标题就能看出,这是典型的MySQL入门第一课,目标群体是刚接触数据库的同学,或者工作中需要补数据库基础的开发人员… · 2026/9/24 20:11:32
AI编程新范式:从提示词到Skills,打造你的专属AI工作流 1. Skills到底是什么:从“反复调教”到“一次说清”大概从今年年初开始,我身边越来越多写代码的朋友开始高频提到一个词:Skills。不管是Claude Code、Codex还是Cursor,都开始把Skills当成一个核心能力来推。坦白讲,我第… · 2026/9/24 20:11:14
本地私有RAG从零搭建全复盘:架构选型、文档切块与向量化实践 1. 为什么做本地私有RAG,以及这篇复盘会讲什么最近我花了两周时间,从零搭了一套“本地私有RAG”出来。起因其实特别朴素:公司内部有一堆产品手册、FAQ、解决方案文档,散落在各个共享盘和协作工具里,业务同事每次找资料… · 2026/9/24 20:11:14
CodeBuddy CLI实战:从安装到自动化编程的完整指南 这是你第一次在终端里敲下一个叫codebuddy的命令,然后看着整个屏幕被一个陌生又熟悉的对话界面接管。熟悉是因为它像极了这两年火起来的 Claude Code、Codex CLI 那一挂东西;陌生是因为你还没有真正让它在你的项目里干过活。我最初抱着"又一个套壳 … · 2026/9/24 20:11:14
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44