ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Flet 事件详解:DismissibleUpdateEvent 拖拽更新事件的结构、字段与实战用法

Flet 事件详解:DismissibleUpdateEvent 拖拽更新事件的结构、字段与实战用法 前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载DismissibleUpdateEvent是 Flet 中Dismissible控件在用户拖拽dismiss 手势过程中持续触发的事件负载event payload。它通过on_update回调向 Python 侧实时上报拖拽方向、进度、是否越过可撤销删除阈值等状态是实现滑动删除前预览进度、到达阈值给出视觉反馈、跨过阈值后执行删除等交互的关键数据源。读完本文你将掌握该事件的全部字段语义、底层触发链路以及结合dismiss_thresholds与confirm_dismiss的完整实战写法。事件概述拖拽过程中实时上报的进度快照DismissibleUpdateEvent定义于 Python 源码 dismissible.py其类文档明确说明它是在 a dismiss gesture is in progress拖拽手势进行中时发出的负载。与DismissibleDismissEvent在确认/完成撤销后触发不同DismissibleUpdateEvent的特点是高频、连续只要用户按住内容进行拖拽就会持续派发让应用能够逐帧感知手势状态。它与Dismissible控件的on_update回调直接绑定ft.Dismissible( contentft.ListTile(titleft.Text(Item)), on_updatehandle_update, # 拖拽过程中持续触发 )从源码结构看DismissibleUpdateEvent继承自flet.controls.control_event.Eventcontrol_event.py因此它同样自带name事件名、control触发事件的控件实例、page事件所属页面等通用字段方便在回调里访问父级控件与页面上下文。字段详解direction / progress / reached / previous_reachedDismissibleUpdateEvent共定义 4 个专属字段全部来自 Flutter 框架Dismissible.onUpdate回调的DismissUpdateDetails参数。逐一定义如下引用自 dismissible.py字段类型语义取值范围/说明directionDismissDirection当前拖拽手势的方向见下文枚举说明progressfloat拖拽进度相对于撤销阈值的0.0~1.0reachedbool当前是否已达到撤销阈值True表示本次更新时已越过阈值previous_reachedbool上一次更新事件时是否已达到阈值用于检测刚刚越界或刚刚退回的边沿变化其中progress与reached的组合是最常用的判断依据progress给出连续进度可用于驱动背景色渐变、图标缩放等过渡动画而reached给出离散的布尔状态决定是否显示松开即可删除的提示。previous_reached则解决了reached本身无法表达状态刚刚发生变化的问题——通过比较reached ! previous_reached应用可以精确捕获刚刚越过阈值reachedTrue, previous_reachedFalse与刚刚拖回阈值内reachedFalse, previous_reachedTrue这两个边沿时刻从而只在这些瞬间执行一次性的反馈逻辑如震动、播放音效。direction 的取值DismissDirection 枚举direction字段的类型DismissDirection是枚举类定义于 snack_bar.py与SnackBar共用同一枚举NONE禁用滑动撤销手势VERTICAL允许向上或向下滑动撤销HORIZONTAL允许向左或向右滑动撤销Dismissible.dismiss_direction的默认值END_TO_START沿尾端到起始端阅读方向滑动LTR 语言即从右往左START_TO_END沿起始端到尾端阅读方向滑动LTR 语言即从左往右UP/DOWN仅允许向上 / 仅允许向下滑动撤销。注意END_TO_START与START_TO_END是感知语言方向locale-aware的在从右到左RTL语言环境中方向会反转适合需要国际化适配的列表删除交互。底层链路从 Flutter 手势到 Python 事件的完整数据流DismissibleUpdateEvent的触发链路横跨 Flutter 端与 Python 端理解它有助于排查事件不触发或字段为 None等问题Flutter 端DismissibleControl构建 Flutter 原生Dismissible控件并把onUpdate回调绑定为将DismissUpdateDetails序列化后触发 update 事件dismissible.dart序列化Dart 侧DismissibleUpdateEvent.toMap()将direction、progress、reached、previous_reached四个字段打包为 JSONdismissible.dart其中direction取details.direction.name字符串值传输与反序列化事件经 Flet 的通信通道送达 Python 侧由Dismissible控件的事件处理机制反序列化为flet.DismissibleUpdateEvent实例Python 回调最终调用on_update绑定的处理函数。关键点Dart 端只有在widget.control.hasEventHandler(update)为真时才会绑定onUpdatedismissible.dart因此不写on_update回调就不会产生任何 update 事件这是对性能的有意优化——高频拖拽事件不会在无人监听时白白穿过通信链路。实战示例滑动删除列表中的实时进度反馈仓库示例 dismissible_list_tiles/main.py 完整演示了DismissibleUpdateEvent的接入方式。下面是一个在示例基础上扩展了阈值边沿检测的完整可运行代码import flet as ft def main(page: ft.Page): def handle_update(e: ft.DismissibleUpdateEvent): # 打印事件负载观察 direction / progress / reached / previous_reached print(e) # 边沿检测刚刚越过阈值 if e.reached and not e.previous_reached: print(fItem 即将被删除direction{e.direction}, progress{e.progress:.2f}) # 刚刚拖回阈值内 if not e.reached and e.previous_reached: print(已取消删除拖回原位) # 用 progress 驱动中间态例如 0~50% 提示继续滑动 if not e.reached and e.progress 0.3: print(继续滑动以删除……) def handle_dismiss(e: ft.Event[ft.Dismissible]): # 真正被删除后从列表移除该行 e.control.parent.controls.remove(e.control) e.control.parent.update() page.add( ft.SafeArea( contentft.ListView( expandTrue, controls[ ft.Dismissible( dismiss_directionft.DismissDirection.HORIZONTAL, backgroundft.Container(bgcolorft.Colors.GREEN), secondary_backgroundft.Container(bgcolorft.Colors.RED), on_updatehandle_update, on_dismisshandle_dismiss, dismiss_thresholds{ ft.DismissDirection.END_TO_START: 0.2, ft.DismissDirection.START_TO_END: 0.2, }, contentft.ListTile(titleft.Text(fItem {i})), ) for i in range(10) ], ), ) ) if __name__ __main__: ft.run(main)要点说明dismiss_thresholds以字典形式按方向分别设置阈值取值0.0~1.0之间的小数即progress达到1.0所对应的拖拽比例。示例中把左右两个方向都设为0.2意味着内容被拖出自身宽度 20% 即视为达到阈值reached与previous_reached正是围绕dismiss_thresholds计算出来的当前拖拽比例 ≥ 阈值时reachedTrue否则为False若未设置on_dismiss即使拖过阈值松手内容也只会弹回原位不会执行删除——真正删除仍由on_dismiss或on_confirm_dismissconfirm_dismiss负责。与 on_confirm_dismiss 协同先预览、后确认DismissibleUpdateEvent常用于预览阶段的反馈而确认逻辑由Dismissible的另一组回调承担on_update拖拽进行中实时反馈本文主题on_confirm_dismiss拖拽松手且达到阈值后触发给应用一个确认或否决的机会此时控件会被锁定无法再次拖拽直到调用confirm_dismiss(bool)解决挂起的决策dismissible.pyon_dismiss内容完成收缩动画、确认撤销后触发。仓库示例 dismissible_list_tiles/main.py 展示了典型组合在on_confirm_dismiss中弹出AlertDialog让用户确认确认后调用e.control.confirm_dismiss(True)完成删除取消则传False让内容回到原位。在这一流程中DismissibleUpdateEvent可以提前告知用户当前拖拽已过阈值松开将弹出确认框避免误触。调试建议由于 update 事件是高频事件直接打印事件对象即可快速观察字段变化规律def handle_update(e: ft.DismissibleUpdateEvent): print(e) # 观察 direction / progress / reached / previous_reached若事件始终不触发按以下顺序排查是否在Dismissible上绑定了on_update未绑定则 Dart 端不注册onUpdate参见 dismissible.dart是否设置了dismiss_direction且手势方向与之一致例如仅UP时左右拖拽不会触发 update控件是否可见——Dismissible.content必须是可见控件dismissible.py。延伸阅读控件完整属性与全部事件Dismissible 控件文档事件基类name/data/control/page字段Event 类型文档同族事件DismissibleDismissEvent与DismissibleUpdateEvent同文件定义dismissible.py承载on_confirm_dismiss/on_dismiss的direction信息完整运行示例dismissible_list_tiles/main.py赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐DINOv2 选型实战4 种规格怎么选才不踩坑DINOv2 选型实战4 种规格怎么选才不踩坑 你要把视觉特征接进分类流水线翻到 DINOv2 从 ViT S/14 到 ViT g/14 的四种规格时卡住前端跨平台桌面应用移动开发Flet Charts 交互事件详解LineChartEvent 的完整字段、事件类型与实战用法Flet Charts 交互事件详解LineChartEvent 的完整字段、事件类型与实战用法 LineChartEvent 是 Flet 图表扩展 fl前端跨平台桌面应用移动开发Flet ContextMenuDismissEvent 事件详解字段、触发时机与实战用法Flet ContextMenuDismissEvent 事件详解字段、触发时机与实战用法 ContextMenuDismissEvent 是 Flet 框架前端跨平台桌面应用移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表