跳到主要内容

2 篇博文 含有标签「新闻」

查看所有标签

Flet 移动更新

· 阅读需 8 分钟
Feodor Fitsner
Flet 创始人和开发者

这篇文章是几个月前发布的 Flet 移动战略 的续篇。

我们最初在移动设备上运行 Flet 的方法是使用 Server-Driven UI(SDUI)。尽管 SDUI 有其自身的优点(如绕过应用商店进行应用更新),但它并不适用于所有情况,需要 Web 服务器托管 Python 部分的应用程序,并且由此增加了响应延迟,这对于需要几乎即时 UI 响应的用户操作(如绘图应用程序)并不理想。

我一直在思考如何将 Python 运行时嵌入到 Flutter iOS 或 Android 应用程序中以运行用户的 Python 程序。毫无疑问,从技术上讲是可行的,因为 Kivy 和 BeeWare 项目已经实现了这一点。

当前的 Flet 架构

当前 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 桌面应用程序的架构:

新的 Flet 桌面应用程序架构图

Flet 移动架构

移动应用程序在一个非常严格的环境中运行,具有许多限制。例如,在 iOS 上,应用程序不能生成新进程。换句话说,Flet Flutter 应用程序不能只是启动 "python.exe" 并将您的脚本作为参数传递。

幸运的是,Python 可以被嵌入到另一个应用程序中作为 C 库,而 Dart(Flutter 应用程序使用的语言)允许通过 FFI(Foreign Function Interface)调用 C 库。

此外,尽管 Android 允许加载动态链接库,但 iOS 要求所有库静态链接到应用程序可执行文件中。如果您有兴趣,这篇文章更详细地介绍了 Dart FFI。

Flet 移动架构可能如下所示:

Flet 移动应用程序架构图

Python 运行时将与 Flutter 客户端应用程序静态或动态链接,并通过 FFI 和/或命名管道进行调用。

尽管在移动设备上运行 Python 存在一些限制。最重要的限制之一是要求使用适用于移动设备 ARM64 架构的“纯” Python 模块或使用专门为移动设备编译的具有本机代码的模块。

异步支持

Asyncio是Python 3的一部分,我们开始看到越来越多的库与异步/等待编程模型一起使用,这对于I/O密集型和UI逻辑更高效。

目前,Flet在新线程中生成所有UI事件处理程序,而且随处可见threading.sleep()调用阻塞线程,仅仅是为了进行一些UI动画。所有这些看起来都很费资源。

在同步代码中使用异步库是可能的,但看起来有些黑客式和低效,因为它会让CPU保持繁忙,只是为了等待异步方法完成。因此,我们希望Flet应用能够对异步代码进行一流的支持。

异步/等待模型是在单个线程中切换任务的状态机。通过使用异步,Flet将能够利用来进行套接字服务器,并使用异步WebSockets库。在单个Flet应用程序中可以同时使用同步和异步事件处理程序,而无需进行任何妥协或黑客。

更令人兴奋的是,异步的Flet将能够完全在浏览器中运行,使用基于WebAssembly(WASM)的Pyodide - 基于WebAssembly(WASM)的Python发行版。WebAssembly尚未支持多线程,因此在单个线程中运行是必须的。想象一下,具有真正离线Flet PWA的Flet Web应用程序,它不需要Web服务器来运行Python代码!

开发计划

我们将在几个迭代中压缩上面的范围:

  1. 支持异步API,并使用异步WebSockets库。与Go中的相同Fletd一起工作。
  2. 使用Python的Fletd服务器("存根")与桌面应用程序一起使用。
  3. 将Python与Fletd“存根”和用户程序嵌入iOS中。
  4. 将Python嵌入Android中。
  5. 为iOS和Android打包移动应用程序。
寻求帮助

🙏 我正在寻找社区中开发Flutter和Python在iOS和Android上的C/C++/本地代码集成部分的帮助。这可以是免费帮助或有偿工作 - 如果你有兴趣,请让我知道!

我们期待与你在Discord(https://discord.gg/dzWXP8SHG8) 频道见面,并积极参与讨论、提供帮助和提问问题!

Flet版本控制和预发布

· 阅读需 3 分钟
Feodor Fitsner
Flet创始人和开发者

Flet是一个快速发展的框架,每隔一天都会提交新功能和错误修复。

每个版本发布一个拉取请求的开发模型对项目来说效果不好,因为用户需要等待数周才能获得新版本,而且从开发角度来看,发布大型的“英勇”版本需要耗费很多精力 🫠。

从现在开始,我们将把版本发布拆分为多个拉取请求,每个拉取请求只包含一个功能或错误修复。

每个合并到main分支的拉取请求将会发布一个预发布(开发中的版本)包到pypi.org,版本格式为X.Y.Z.devN

安装预发布版本

要安装Flet的预发布版本,请使用以下命令:

pip install flet --pre
信息

我们建议将预发布版本安装在虚拟环境中。

Flet版本控制

Flet将切换到语义化版本控制,版本号格式为MAJOR.MINOR.PATCH

  1. 当存在“不兼容的API更改”时,MAJOR将递增。目前是0,当我们认为Flet API足够稳定时,我们将其更改为1
  2. 当以向后兼容的方式添加新功能时,MINOR将递增。
  3. 当进行向后兼容的错误修复时,PATCH将递增。

根据这个规则,即将发布的Flet版本将是0.2.0。该版本的错误修复将标记为0.2.10.2.2等。在该版本之后的下一个发布将是0.3.0,以此类推。

Flet的预发布版本将采用MAJOR.{LAST_MINOR + 1}.0.dev{BUILD}的格式,其中LAST_MINOR是上一个发布的MINOR版本,{BUILD}是由CI设置的构建号。例如,如果最后发布的版本是0.1.65,那么预发布版本将具有版本号0.2.0.dev{BUILD}。在0.2.0发布之后的预发布版本将被标记为0.3.0.dev{BUILD}