構(gòu)、字段與實(shí)戰(zhàn)用法)
前端跨平臺(tái)桌面應(yīng)用移動(dòng)開發(fā)【免費(fèi)下載鏈接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.項(xiàng)目地址https://gitcode.com/gh_mirrors/fl/flet點(diǎn)擊查看免費(fèi)下載DismissibleUpdateEvent是 Flet 中Dismissible控件在用戶拖拽dismiss 手勢(shì)過程中持續(xù)觸發(fā)的事件負(fù)載event payload。它通過on_update回調(diào)向 Python 側(cè)實(shí)時(shí)上報(bào)拖拽方向、進(jìn)度、是否越過可撤銷刪除閾值等狀態(tài)是實(shí)現(xiàn)滑動(dòng)刪除前預(yù)覽進(jìn)度、到達(dá)閾值給出視覺反饋、跨過閾值后執(zhí)行刪除等交互的關(guān)鍵數(shù)據(jù)源。讀完本文你將掌握該事件的全部字段語(yǔ)義、底層觸發(fā)鏈路以及結(jié)合dismiss_thresholds與confirm_dismiss的完整實(shí)戰(zhàn)寫法。事件概述拖拽過程中實(shí)時(shí)上報(bào)的進(jìn)度快照DismissibleUpdateEvent定義于 Python 源碼 dismissible.py其類文檔明確說明它是在 a dismiss gesture is in progress拖拽手勢(shì)進(jìn)行中時(shí)發(fā)出的負(fù)載。與DismissibleDismissEvent在確認(rèn)/完成撤銷后觸發(fā)不同DismissibleUpdateEvent的特點(diǎn)是高頻、連續(xù)只要用戶按住內(nèi)容進(jìn)行拖拽就會(huì)持續(xù)派發(fā)讓應(yīng)用能夠逐幀感知手勢(shì)狀態(tài)。它與Dismissible控件的on_update回調(diào)直接綁定ft.Dismissible( contentft.ListTile(titleft.Text(Item)), on_updatehandle_update, # 拖拽過程中持續(xù)觸發(fā) )從源碼結(jié)構(gòu)看DismissibleUpdateEvent繼承自flet.controls.control_event.Eventcontrol_event.py因此它同樣自帶name事件名、control觸發(fā)事件的控件實(shí)例、page事件所屬頁(yè)面等通用字段方便在回調(diào)里訪問父級(jí)控件與頁(yè)面上下文。字段詳解direction / progress / reached / previous_reachedDismissibleUpdateEvent共定義 4 個(gè)專屬字段全部來(lái)自 Flutter 框架Dismissible.onUpdate回調(diào)的DismissUpdateDetails參數(shù)。逐一定義如下引用自 dismissible.py字段類型語(yǔ)義取值范圍/說明directionDismissDirection當(dāng)前拖拽手勢(shì)的方向見下文枚舉說明progressfloat拖拽進(jìn)度相對(duì)于撤銷閾值的0.0~1.0reachedbool當(dāng)前是否已達(dá)到撤銷閾值True表示本次更新時(shí)已越過閾值previous_reachedbool上一次更新事件時(shí)是否已達(dá)到閾值用于檢測(cè)剛剛越界或剛剛退回的邊沿變化其中progress與reached的組合是最常用的判斷依據(jù)progress給出連續(xù)進(jìn)度可用于驅(qū)動(dòng)背景色漸變、圖標(biāo)縮放等過渡動(dòng)畫而reached給出離散的布爾狀態(tài)決定是否顯示松開即可刪除的提示。previous_reached則解決了reached本身無(wú)法表達(dá)狀態(tài)剛剛發(fā)生變化的問題——通過比較reached ! previous_reached應(yīng)用可以精確捕獲剛剛越過閾值reachedTrue, previous_reachedFalse與剛剛拖回閾值內(nèi)reachedFalse, previous_reachedTrue這兩個(gè)邊沿時(shí)刻從而只在這些瞬間執(zhí)行一次性的反饋邏輯如震動(dòng)、播放音效。direction 的取值DismissDirection 枚舉direction字段的類型DismissDirection是枚舉類定義于 snack_bar.py與SnackBar共用同一枚舉NONE禁用滑動(dòng)撤銷手勢(shì)VERTICAL允許向上或向下滑動(dòng)撤銷HORIZONTAL允許向左或向右滑動(dòng)撤銷Dismissible.dismiss_direction的默認(rèn)值END_TO_START沿尾端到起始端閱讀方向滑動(dòng)LTR 語(yǔ)言即從右往左START_TO_END沿起始端到尾端閱讀方向滑動(dòng)LTR 語(yǔ)言即從左往右UP/DOWN僅允許向上 / 僅允許向下滑動(dòng)撤銷。注意END_TO_START與START_TO_END是感知語(yǔ)言方向locale-aware的在從右到左RTL語(yǔ)言環(huán)境中方向會(huì)反轉(zhuǎn)適合需要國(guó)際化適配的列表刪除交互。底層鏈路從 Flutter 手勢(shì)到 Python 事件的完整數(shù)據(jù)流DismissibleUpdateEvent的觸發(fā)鏈路橫跨 Flutter 端與 Python 端理解它有助于排查事件不觸發(fā)或字段為 None等問題Flutter 端DismissibleControl構(gòu)建 Flutter 原生Dismissible控件并把onUpdate回調(diào)綁定為將DismissUpdateDetails序列化后觸發(fā) update 事件dismissible.dart序列化Dart 側(cè)DismissibleUpdateEvent.toMap()將direction、progress、reached、previous_reached四個(gè)字段打包為 JSONdismissible.dart其中direction取details.direction.name字符串值傳輸與反序列化事件經(jīng) Flet 的通信通道送達(dá) Python 側(cè)由Dismissible控件的事件處理機(jī)制反序列化為flet.DismissibleUpdateEvent實(shí)例Python 回調(diào)最終調(diào)用on_update綁定的處理函數(shù)。關(guān)鍵點(diǎn)Dart 端只有在widget.control.hasEventHandler(update)為真時(shí)才會(huì)綁定onUpdatedismissible.dart因此不寫on_update回調(diào)就不會(huì)產(chǎn)生任何 update 事件這是對(duì)性能的有意優(yōu)化——高頻拖拽事件不會(huì)在無(wú)人監(jiān)聽時(shí)白白穿過通信鏈路。實(shí)戰(zhàn)示例滑動(dòng)刪除列表中的實(shí)時(shí)進(jìn)度反饋倉(cāng)庫(kù)示例 dismissible_list_tiles/main.py 完整演示了DismissibleUpdateEvent的接入方式。下面是一個(gè)在示例基礎(chǔ)上擴(kuò)展了閾值邊沿檢測(cè)的完整可運(yùn)行代碼import flet as ft def main(page: ft.Page): def handle_update(e: ft.DismissibleUpdateEvent): # 打印事件負(fù)載觀察 direction / progress / reached / previous_reached print(e) # 邊沿檢測(cè)剛剛越過閾值 if e.reached and not e.previous_reached: print(fItem 即將被刪除direction{e.direction}, progress{e.progress:.2f}) # 剛剛拖回閾值內(nèi) if not e.reached and e.previous_reached: print(已取消刪除拖回原位) # 用 progress 驅(qū)動(dòng)中間態(tài)例如 0~50% 提示繼續(xù)滑動(dòng) if not e.reached and e.progress 0.3: print(繼續(xù)滑動(dòng)以刪除……) 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)要點(diǎn)說明dismiss_thresholds以字典形式按方向分別設(shè)置閾值取值0.0~1.0之間的小數(shù)即progress達(dá)到1.0所對(duì)應(yīng)的拖拽比例。示例中把左右兩個(gè)方向都設(shè)為0.2意味著內(nèi)容被拖出自身寬度 20% 即視為達(dá)到閾值reached與previous_reached正是圍繞dismiss_thresholds計(jì)算出來(lái)的當(dāng)前拖拽比例 ≥ 閾值時(shí)reachedTrue否則為False若未設(shè)置on_dismiss即使拖過閾值松手內(nèi)容也只會(huì)彈回原位不會(huì)執(zhí)行刪除——真正刪除仍由on_dismiss或on_confirm_dismissconfirm_dismiss負(fù)責(zé)。與 on_confirm_dismiss 協(xié)同先預(yù)覽、后確認(rèn)DismissibleUpdateEvent常用于預(yù)覽階段的反饋而確認(rèn)邏輯由Dismissible的另一組回調(diào)承擔(dān)on_update拖拽進(jìn)行中實(shí)時(shí)反饋本文主題on_confirm_dismiss拖拽松手且達(dá)到閾值后觸發(fā)給應(yīng)用一個(gè)確認(rèn)或否決的機(jī)會(huì)此時(shí)控件會(huì)被鎖定無(wú)法再次拖拽直到調(diào)用confirm_dismiss(bool)解決掛起的決策dismissible.pyon_dismiss內(nèi)容完成收縮動(dòng)畫、確認(rèn)撤銷后觸發(fā)。倉(cāng)庫(kù)示例 dismissible_list_tiles/main.py 展示了典型組合在on_confirm_dismiss中彈出AlertDialog讓用戶確認(rèn)確認(rèn)后調(diào)用e.control.confirm_dismiss(True)完成刪除取消則傳False讓內(nèi)容回到原位。在這一流程中DismissibleUpdateEvent可以提前告知用戶當(dāng)前拖拽已過閾值松開將彈出確認(rèn)框避免誤觸。調(diào)試建議由于 update 事件是高頻事件直接打印事件對(duì)象即可快速觀察字段變化規(guī)律def handle_update(e: ft.DismissibleUpdateEvent): print(e) # 觀察 direction / progress / reached / previous_reached若事件始終不觸發(fā)按以下順序排查是否在Dismissible上綁定了on_update未綁定則 Dart 端不注冊(cè)onUpdate參見 dismissible.dart是否設(shè)置了dismiss_direction且手勢(shì)方向與之一致例如僅UP時(shí)左右拖拽不會(huì)觸發(fā) update控件是否可見——Dismissible.content必須是可見控件dismissible.py。延伸閱讀控件完整屬性與全部事件Dismissible 控件文檔事件基類name/data/control/page字段Event 類型文檔同族事件DismissibleDismissEvent與DismissibleUpdateEvent同文件定義dismissible.py承載on_confirm_dismiss/on_dismiss的direction信息完整運(yùn)行示例dismissible_list_tiles/main.py贊分享前端跨平臺(tái)桌面應(yīng)用移動(dòng)開發(fā)【免費(fèi)下載鏈接】fletBuild realtime web, mobile and desktop apps in Python only. No frontend experience required.項(xiàng)目地址https://gitcode.com/gh_mirrors/fl/flet點(diǎn)擊查看免費(fèi)下載相關(guān)推薦DINOv2 選型實(shí)戰(zhàn)4 種規(guī)格怎么選才不踩坑DINOv2 選型實(shí)戰(zhàn)4 種規(guī)格怎么選才不踩坑 你要把視覺特征接進(jìn)分類流水線翻到 DINOv2 從 ViT S/14 到 ViT g/14 的四種規(guī)格時(shí)卡住前端跨平臺(tái)桌面應(yīng)用移動(dòng)開發(fā)Flet Charts 交互事件詳解LineChartEvent 的完整字段、事件類型與實(shí)戰(zhàn)用法Flet Charts 交互事件詳解LineChartEvent 的完整字段、事件類型與實(shí)戰(zhàn)用法 LineChartEvent 是 Flet 圖表擴(kuò)展 fl前端跨平臺(tái)桌面應(yīng)用移動(dòng)開發(fā)Flet ContextMenuDismissEvent 事件詳解字段、觸發(fā)時(shí)機(jī)與實(shí)戰(zhàn)用法Flet ContextMenuDismissEvent 事件詳解字段、觸發(fā)時(shí)機(jī)與實(shí)戰(zhàn)用法 ContextMenuDismissEvent 是 Flet 框架前端跨平臺(tái)桌面應(yīng)用移動(dòng)開發(fā)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考