Flet 移动端更新
· 阅读需 8 分钟
本文是几个月前发布的Flet 移动端战略的延续。
我们最初在移动设备上运行 Flet 的方法是服务器驱动的 UI(SDUI)。尽管 SDUI 有其自身的优点(比如绕过应用商店进行应用更新),但它并不适用于所有情况,需要 Web 服务器来托管应用程序的 Python 部分,并且由此增加了响应延迟,这对于需要几乎即时 UI 响应的用户操作(如绘图应用程序)并不理想。
我一直在思考如何将 Python 运行时嵌入到 Flutter iOS 或 Android 应用程序中以运行用户的 Python 程序。毫无疑问,从技术上讲是可行的,因为 Kivy 和 BeeWare 项目已经实现了这一点。
当前的 Flet 架构
当前 Flet 桌面应用程序的架构如下图所示:
在桌面上运行 Flet 程序涉及到三个应用程序(进程)协同工作:
- Python 运行时 (
python3
) - 运行您的 Python 脚本的 Python 解释器。这是您从命令行启动的内容。Python 启动 Fletd 服务器并通过 WebSockets 连接到它。 - Fletd 服务器 (
fletd
) - 使用 Go 编写的 Flet Web 服务器,监听一个 TCP 端口。Fletd 保存所有用户会话的状态(对于桌面应用程序只有一个会话),并在 Python 程序和 Flet 客户端之间分发页面更新和用户生成的事件。 - Flet 客户端 (
flet
) - 使用 Flutter 编写的桌面应用程序,在本地操作系统窗口中显示 UI。Flet 客户端通过 WebSockets 连接到 Fletd 服务器。
上述架构对于 Flet Web 应用程序效果良好,因为 Web 服务器是必要的一部分,但对于桌面应用程序来说似乎是多余的:
- 如果所有三个进程在同一台计算机上运行,WebSockets 可以用消息传递队列或命名管道替代,减少开销。
- 对于只有一个用户会话且 UI 状态永久存储在 Flet 桌面客户端中且从不“重新加载”的桌面应用程序来说,Fletd 服务器没有多大意义。
新的 Flet 桌面架构
通过将 Fletd 替换为用 Python 编写的“存根”,并通过 sockets(Windows)和 named pipes(macOS 和 Linux)与 Flet 桌面客户端通信,可以简化 Flet 桌面应用程序的架构: