驾驭未来:深度体验 Flet 0.7.0 的重大变革与服务化架构
驾驭未来:深度体验 Flet 0.7.0 的重大变革与服务化架构
最近用Flet做了一个可以支持同声传译的应用,来两段和苹果airpod的对比,大家看看效果:
用了Flet框架支持多平台,这个旨在让开发者用 Python 轻松构建多平台应用的项目,在其最新的 0.7.0.dev 预发布版本中,进行了一次堪称里程碑式的更新。
正好最近有朋友点名要文件上传下载功能,就顺便升级到了0.7.0.dev版本上。这次更新并非简单的功能堆砌,而是一次对框架核心架构的重新思考,它将 “服务化” (Services) 概念推向前台,极大地提升了应用的稳定性和开发体验。
今天,我将带您一起深度体验这次更新,并分享如何一步到位地配置环境,以及如何将您的代码优雅地迁移到新的异步范式。
一、前瞻配置:锁定精确预发布版本
要体验最前沿的特性,就需要精准地锁定版本。我强烈推荐使用 Poetry 进行依赖管理,它能完美地处理预发布版本。在你的 pyproject.toml
所在目录,执行以下命令,即可构建一个完全复现的开发环境:
# 添加主库和音频录制扩展的精确开发版本
poetry add "flet[all]==0.70.0.dev5623" --allow-prereleases
poetry add "flet-audio-recorder==0.2.0.dev504" --allow-prereleases
对于 CI/CD 环境(如 GitHub Actions),你的安装步骤应相应调整:
- name: Install dependenciesrun: |pip install --pre 'flet[all]==0.70.0.dev5623'
二、核心变革:理解“服务化”架构
本次更新最核心的概念是引入了 “服务” (Service)。什么是服务?你可以将其理解为一个持久化的、非可视化的控制器。它最大的优势是能够“存活”于页面(Page
)的生命周期之外。
这意味着:
- 更强的稳定性:服务不会因为页面的刷新、跳转或更新而被意外销毁。
- 更好的状态管理:一些需要后台持续运行的功能(如音频播放、地理定位)有了更可靠的载体。
- 清晰的职责分离:UI 控件负责显示,服务控件负责逻辑和状态,架构更加清晰。
许多我们熟悉的功能都已被重新实现为服务,这是一个破坏性变更 (Breaking Change),包括:
Audio
, AudioRecorder
, FilePicker
, Flashlight
, Geolocator
, HapticFeedback
, InterstitialAd
, PermissionHandler
, SemanticsService
, ShakeDetector
等。
如何使用服务?
在使用任何服务之前,你必须将其添加到页面的 services
集合中,这是一个与 controls
集合平级的新属性。
import flet as ftdef main(page: ft.Page):# 在页面初始化时添加需要的服务file_picker = ft.FilePicker()page.services.append(file_picker) # 必须添加!page.add(ft.ElevatedButton("Pick files", on_click=lambda e: pick_files()))async def pick_files():# 新的API调用方式...pass
三、实战迁移:从事件回调到优雅异步
让我们通过两个最常用的模块来看看新范式带来的代码美感提升。
1. FilePicker: 告别繁琐的事件监听
旧模式 (事件驱动):
过去,使用 FilePicker
需要先定义事件处理函数,等待 on_result
事件被触发,整个过程是异步且非线性的。
def main(page: ft.Page):def on_file_picker_result(e: ft.FilePickerResultEvent):print("Selected files:", e.files)file_picker = ft.FilePicker(on_result=on_file_picker_result)page.overlay.append(file_picker) # 旧版添加到overlaydef pick_click(e):file_picker.pick_files(allow_multiple=True)page.add(ft.ElevatedButton("Pick files", on_click=pick_click))
新模式 (异步等待):
现在,API 提供了直接的 async
方法,立刻返回结果。代码变得线性、直观,仿佛在编写同步代码,极大地提升了可读性和可维护性。
import flet as ftasync def main(page: ft.Page):file_picker = ft.FilePicker()page.services.append(file_picker) # 新版添加到servicesasync def pick_click(e):# 一行代码,直接获取结果!selected_files: list[ft.FilePickerFile] = await file_picker.pick_files_async(allow_multiple=True)if selected_files:for f in selected_files:print(f.name, f.path)else:print("Cancelled!")page.add(ft.ElevatedButton("Pick files", on_click=pick_click))
save_file_async()
和 get_directory_path_async()
的使用方式完全相同。
2. flet-audio-recorder: 更直观的音频控制
音频录制扩展也紧随核心框架的步伐,进行了现代化改造。
旧代码 (方法调用无等待):
def handle_start_recording(self, e):"""处理开始录音"""self.sound_manager.start_recording() # 无法轻松等待完成或处理错误
新代码 (清晰的异步控制):
async def handle_start_recording(self, e):"""处理开始录音"""try:await self.sound_manager.start_recording() # 异步等待,流程清晰# 录制开始后的逻辑except Exception as error:# 优雅的错误处理print(f"Recording failed: {error}")
这种改变使得管理录音的生命周期(开始、停止、错误处理)变得前所未有的简单和可靠。
四、总结与展望
Flet 0.7.0 的这次变革,远不止于 API 的简单调整。它标志着 Flet 框架正在从一个“高级的 UI 包装库”向着一个拥有坚实、稳定底层架构的成熟应用框架迈进。
- 对于开发者而言:
async/await
语法糖的全面引入,让复杂异步操作的代码变得简洁优雅,减少了嵌套回调带来的“回调地狱”,无疑是开发体验的一次巨大飞跃。 - 对于应用而言:服务化架构解决了状态持久化的核心痛点,为开发更复杂、更稳定的应用奠定了坚实的基础,让我们对 Flet 在生产环境中的应用充满了信心。
这次更新需要开发者付出一些学习与迁移的成本,但我认为这完全是值得的。它代表着框架的进化方向与现代 Python 开发的最佳实践保持了一致。
作为一名 DevRel,我对此感到兴奋不已。我坚信,深入理解并率先应用这些变革,不仅能让我们打造出更出色的产品,更能在这个过程中塑造我们作为技术前沿洞察者和可靠问题解决者的个人品牌。
让我们一起,拥抱变化,驾驭未来。
关于作者:SamYuan,开源爱好者,专注于帮助开发者解锁技术潜能并构建卓越产品。欢迎在Github上关注我,获取更多深度技术内容。
本文PR地址 link
本文项目主页