首页/新闻资讯/正文详情

Flet DismissibleDismissEvent 详解:滑动删除事件的载荷结构与确认/完成回调实战

发布时间:2026/9/23 22:37:16 来源:云帆数科 栏目:资讯中心
Flet DismissibleDismissEvent 详解:滑动删除事件的载荷结构与确认/完成回调实战
前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载本篇技术指南围绕 FletPython 全栈 UI 框架中Dismissible控件的事件类型DismissibleDismissEvent展开说明该事件载荷在on_confirm_dismiss与on_dismiss两个回调中的真实结构与用法并结合仓库源码与官方示例给出可复制的滑动删除列表、二次确认删除等实战方案。读完本文你将掌握 Dismissible 事件体系DismissEvent / UpdateEvent的字段含义、DismissDirection的七个枚举取值以及confirm_dismiss()确认/否决机制的完整调用链。一、事件类型定位它是谁、由谁使用DismissibleDismissEvent是 Flet 中Dismissible控件的事件载荷event payload在官方文档站点中由website/docs/types/dismissibledismissevent.md通过ClassAll nameflet.DismissibleDismissEvent /组件动态渲染生成。它的源码定义位于 sdk/python/packages/flet/src/flet/controls/core/dismissible.py#L23-L35dataclass class DismissibleDismissEvent(Event[Dismissible]): Event payload for dismissal confirmation and completion callbacks. Used by :attr:flet.Dismissible.on_confirm_dismiss and :attr:flet.Dismissible.on_dismiss. direction: DismissDirection Direction in which the control is being (or was) dismissed. 从源码结构可以提炼出三个关键事实它是dataclass以数据类的形式承载事件载荷并继承Event[Dismissible]泛型参数表明该事件与Dismissible控件实例绑定处理器中可通过e.control拿到触发事件的Dismissible对象。它服务于两个回调Dismissible.on_confirm_dismiss待确认的滑出动作允许应用确认或否决与Dismissible.on_dismiss控件被最终移除后触发。两处处理器类型均为EventHandler[DismissibleDismissEvent]见 dismissible.py#L165-L178。它只有一个字段direction用来告知应用“控件正在/已经朝哪个方向被滑出”这是区分“左滑删除”还是“右滑操作”的唯一依据。二、唯一字段 direction值与语义direction的类型是DismissDirection枚举定义于 sdk/python/packages/flet/src/flet/controls/material/snack_bar.py#L47-L98共 7 个取值枚举值底层字符串语义DismissDirection.NONEnone禁用滑动移除手势DismissDirection.VERTICALvertical允许垂直方向滑动向上或向下均可DismissDirection.HORIZONTALhorizontal允许水平方向滑动向左或向右均可DismissDirection.END_TO_STARTendToStart沿阅读方向的“末尾 → 开头”滑动LTR 语言环境中即右滑右 → 左DismissDirection.START_TO_ENDstartToEnd沿阅读方向的“开头 → 末尾”滑动LTR 语言环境中即左滑左 → 右DismissDirection.UPup仅允许向上滑动DismissDirection.DOWNdown仅允许向下滑动注意END_TO_START/START_TO_END是**方向无关direction-agnostic**的语义化取值它们跟随阅读方向locale自动映射而UP/DOWN/HORIZONTAL/VERTICAL是物理方向取值。在事件处理器中读取e.direction时建议优先使用END_TO_START/START_TO_END这类语义化取值做分支判断以自动适配 RTL从右到左语言环境。该枚举与SnackBar的滑动关闭共用同一实现说明DismissDirection是 Flet 中“滑动方向”的通用类型。三、事件从哪来Dismissible 控件的滑动移除机制要正确使用该事件需要先了解承载它的Dismissible控件定义于 dismissible.py#L66-L77控件可以在指定的dismiss_direction方向上被拖拽或甩动其content会平滑滑出视野若设置了resize_duration滑出后还会沿垂直方向垂直于滑动方向将高度收缩至零最终触发on_dismiss。与本次事件直接相关的控件配置项dismiss_direction: DismissDirection DismissDirection.HORIZONTAL允许滑动的方向默认水平。dismiss_thresholds: dict[DismissDirection, Optional[Number]]判定“已滑出”的阈值字典键为DismissDirection值为0.0~1.0之间的小数相对控件宽度的比例示例见 dismissible.py#L114-L133ft.Dismissible( # ... dismiss_thresholds{ ft.DismissDirection.VERTICAL: 0.1, ft.DismissDirection.START_TO_END: 0.7 } )on_dismiss: Optional[EventHandler[DismissibleDismissEvent]]控件完成滑出动画与收缩后触发是移除数据的最终时机。on_confirm_dismiss: Optional[EventHandler[DismissibleDismissEvent]]控件滑出但在正式移除前触发给应用“确认或否决”的机会在该回调未通过confirm_dismiss()解决之前控件无法再次被拖动。on_update: Optional[EventHandler[DismissibleUpdateEvent]]拖拽过程中的实时回调见下文第五节。四、完整实战滑动删除列表项仓库官方示例 sdk/python/examples/controls/core/dismissible/dismissible_list_tiles/main.py 演示了DismissibleDismissEvent最典型的三种用法右滑直接删除、左滑弹出确认对话框、拖拽过程中打印更新事件import flet as ft def main(page: ft.Page): async def handle_dialog_action_click(e: ft.Event[ft.TextButton]): page.pop_dialog() await dialog.data.confirm_dismiss(e.control.data) dialog ft.AlertDialog( modalTrue, titleft.Text(Please confirm), contentft.Text(Do you really want to delete this item?), actions[ ft.TextButton(Yes, dataTrue, on_clickhandle_dialog_action_click), ft.TextButton(No, dataFalse, on_clickhandle_dialog_action_click), ], actions_alignmentft.MainAxisAlignment.CENTER, ) async def handle_confirm_dismiss(e: ft.DismissibleDismissEvent): if e.direction ft.DismissDirection.END_TO_START: dialog.data e.control page.show_dialog(dialog) else: await e.control.confirm_dismiss(True) def handle_dismiss(e: ft.Event[ft.Dismissible]): e.control.parent.controls.remove(e.control) e.control.parent.update() def handle_update(e: ft.DismissibleUpdateEvent): print(e) 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_dismisshandle_dismiss, on_updatehandle_update, on_confirm_dismisshandle_confirm_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)该示例完整展示了事件载荷的三个消费路径读取e.direction做分支handle_confirm_dismiss中通过if e.direction ft.DismissDirection.END_TO_START判断“左滑”LTR 下为右 → 左走弹窗确认流程其余方向直接放行。通过e.control访问控件实例handle_confirm_dismiss将e.control暂存到对话框的data字段等待用户点击“Yes/No”后再调用其confirm_dismiss()方法handle_dismiss中则通过e.control.parent定位父级列表把已删除的控件从列表数据中移除并刷新。on_dismiss完成数据清理控件在 Flutter 端完成动画后Flet 端回调handle_dismiss此时才真正从数据源ListView.controls中删除该项并update()同步 UI。confirm_dismiss确认/否决的核心方法confirm_dismiss(dismiss: bool)是Dismissible的异步方法dismissible.py#L197-L209必须由on_confirm_dismiss回调引发的确认流程来调用传入True继续滑出动画并最终移除控件随后触发on_dismiss。传入False取消滑出控件回到原始位置on_dismiss不会被触发。示例中“Yes”按钮携带dataTrue点击后执行await dialog.data.confirm_dismiss(True)“No”按钮携带dataFalse执行confirm_dismiss(False)控件回弹。data属性e.control.data在此充当事件与对话框之间的临时数据通道是 Flet 中常见的跨回调传值模式。五、与 DismissibleUpdateEvent 的区分完成事件 vs 过程事件同一个控件还有配套的过程事件DismissibleUpdateEventdismissible.py#L38-L62二者极易混淆源码字段对比一目了然事件类型触发时机字段DismissibleDismissEvent滑出完成on_dismiss或待确认on_confirm_dismissdirectionDismissibleUpdateEvent拖拽过程中实时触发on_updatedirection、progress0.0~1.0、reached、previous_reachedDismissibleUpdateEvent的progress表示相对滑动阈值的拖拽进度reached表示当前是否达到阈值previous_reached表示上一次更新事件时是否已达阈值——这三个字段适合实现“滑过阈值变红”等反馈效果。而DismissibleDismissEvent只关心最终结果字段更精简。两者已通过 sdk/python/packages/flet/src/flet/init.py 导出为flet.DismissibleDismissEvent与flet.DismissibleUpdateEvent可直接从import flet as ft命名空间引用。六、常见陷阱声明式 UI 中移除 Dismissible 必须指定 keyDismissible控件文档website/docs/controls/dismissible.md专门提醒在 Flet 组件声明式 UI内部使用Dismissible时必须为每个实例指定唯一的key。原因是用户滑出某项后该 widget 在 Flutter 端已被标记为 “dismissed” 并从 UI 移除但 Python 端重新计算 UI diff 时如果没有key作为身份标识diff 算法会按列表顺序猜测“只是元素发生了位移”从而生成“更新 0…N-1 项、删除最后一项”的更新指令。此时 Flutter 端中间那个已被移除的Dismissible无法再接收更新导致运行时错误。因此应始终基于条目 ID 或索引为每个Dismissible分配稳定且唯一的key。总结DismissibleDismissEvent是 FletDismissible控件“滑动移除”生命周期中完成/确认两个关键时刻的标准事件载荷direction字段结合DismissDirection枚举让你区分滑动方向e.control让你拿到控件实例配合confirm_dismiss(True/False)可实现“右滑直接删、左滑需确认”的交互闭环。在声明式 UI 中滑动删除条目时请务必为每个Dismissible设置稳定的key并遵循“on_confirm_dismiss做判断、on_dismiss做数据清理”的分层职责即可构建健壮且体验流畅的滑动操作界面。赞分享前端跨平台桌面应用移动开发【免费下载链接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.项目地址https://gitcode.com/gh_mirrors/fl/flet点击查看免费下载相关推荐Flet DragTargetLeaveEvent 详解拖放目标离开事件的载荷结构与实战用法Flet DragTargetLeaveEvent 详解拖放目标离开事件的载荷结构与实战用法 flet.DragTargetLeaveEvent 是 Flet前端跨平台桌面应用移动开发Flet 拖拽结束事件 DragEndEventPython 侧完整回调载荷与源码实现剖析Flet 拖拽结束事件 DragEndEventPython 侧完整回调载荷与源码实现剖析 拖拽手势Drag/Pan是 Flutter 移动与桌面应用中最前端跨平台桌面应用移动开发Flet 多视图事件详解MultiViewRemoveEvent 事件载荷与视图移除通知机制Flet 多视图事件详解MultiViewRemoveEvent 事件载荷与视图移除通知机制 MultiViewRemoveEvent 是 Flet 多视图前端跨平台桌面应用移动开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

基于EasyX的C++五子棋游戏开发实战:从环境搭建到AI对战
基于EasyX的C++五子棋游戏开发实战:从环境搭建到AI对战

简介:这款基于C与easyx库实现的五子棋游戏设计源码,面向C初学者、图形编程爱好者与游戏开发入门者,可帮助解决从控制台程序向图形界面游戏过渡的常见难题。项目完整覆盖棋盘绘制、鼠标交互、落子判定、人机AI对战等关键环节,并保留… · 2026/9/23 22:37:16

去中心化竞价Agent市场:AI Agent自主接活的开源协议
去中心化竞价Agent市场:AI Agent自主接活的开源协议

刚看到这个标题的时候,我第一反应是"又一个蹭 AI 热点的玩具项目",但仔细翻完仓库之后我改观了。这个名为"去中心化竞价 Agent 市场"的开源项目,核心贡献者里有几位是 OpenAI 的工程师,做的事情一句话概括就是… · 2026/9/23 22:37:10

Word中数字字母标点如何统一为Times New Roman?一文讲透字体替换技巧
Word中数字字母标点如何统一为Times New Roman?一文讲透字体替换技巧

毕业论文、投稿论文、项目报告,格式要求里最常见的一句话就是“英文、数字、标点统一为Times New Roman”。我猜你现在搜的标题里写的是“Times News Romans”,这个拼写是顺手打错了,正确写法是Times New Roman,中文圈里常叫它“新… · 2026/9/23 22:37:10

WPS自动目录与分节页码设置全攻略:从标题样式到更新域
WPS自动目录与分节页码设置全攻略:从标题样式到更新域

1. 为什么手动敲目录这件事,早晚得换成自动化如果你写过超过二十页的文档,大概率经历过这种崩溃:正文改了三级标题,回头发现目录里的页码全对不上,只能一页一页翻着数,数到眼花还容易错位。更别提那种“目录… · 2026/9/23 23:13:22

SMS中文手册实战指南:RMA2地表水模拟从网格到运行
SMS中文手册实战指南:RMA2地表水模拟从网格到运行

简介:这份《SMS中文使用手册》面向水利、水文、环境工程及地表水模拟领域的学习者与工程技术人员,用于解决SMS软件界面陌生、操作流程不熟、建模步骤难以入手等问题,适合从入门到进阶的读者系统查阅。资源为单个PDF文件,压缩包约2… · 2026/9/23 23:12:51

根号怎么打?电脑手机四种输入方法全攻略
根号怎么打?电脑手机四种输入方法全攻略

1. 为什么“打根号”看起来是个小事,却总有人卡住先说个我自己的真实经历。早几年做课件,要写一道二次根式的例题,我在键盘上找了一圈,发现符号面板里压根没有√这个键,最后只能老老实实打“根号”两个字,再… · 2026/9/23 23:12:51

区块链数据共享系统源码解析:IPFS存储+以太坊记账+ABE授权
区块链数据共享系统源码解析:IPFS存储+以太坊记账+ABE授权

简介:这套基于IPFS、Ethereum与基于属性加密(ABE)的区块链安全数据共享系统设计源码,面向区块链开发者和数据安全研究人员,适用于金融、医疗、供应链等对访问控制要求较高的场景,通过IPFS实现分布式存储&am… · 2026/9/23 23:12:32

kornia YUV 色彩转换:docstring 示例修复、测试覆盖恢复与形状校验深度解析
kornia YUV 色彩转换:docstring 示例修复、测试覆盖恢复与形状校验深度解析

计算机视觉深度学习人工智能图像处理 【免费下载链接】kornia 🐍 空间人工智能的几何计算机视觉库 项目地址: https://gitcode.com/kornia/kornia 点击查看 免费下载 kornia 在 kornia.color 模块中提供了一套完整的 YUV 色彩空间转换 API,覆… · 2026/9/23 23:12:32

K线周期规则实战:大周期定方向,小周期找买卖点
K线周期规则实战:大周期定方向,小周期找买卖点

1. 周期规则的本质:先搞清楚K线背后的时间级别做交易时间久了你会发现一个很扎心的事实:绝大多数人亏钱,不是不懂技术指标,而是把不同级别的信号混在一起用。日线刚出现买入信号,15分钟图一跌就拿不住,反过… · 2026/9/23 23:12:26

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码