跳到主要内容

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

查看所有标签

Flet 移动端更新

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

本文是几个月前发布的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 桌面应用程序的架构:

Flet 移动架构

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

幸运的是,Python 可以被嵌入到另一个应用程序作为 C 库,并且 Dart(Flutter 应用程序编写的语言)允许通过FFI(外部函数接口)调用 C 库。

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

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

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

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

异步支持

Asyncio 是 Python 3 的一部分,我们开始看到越来越多的库开始适应 async/await 编程模型,这对于 I/O 绑定和 UI 逻辑更有效。

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

使用异步库的异步代码 是可能的,但看起来很别扭且效率低下,因为它让 CPU 忙于等待异步方法完成。因此,我们希望 Flet 应用程序能够对异步代码提供一流支持。

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

更令人兴奋的是,异步 Flet 将能够完全在Pyodide内运行,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 讨论该计划,提供帮助,提出问题!

Flet版本控制与预发布

· 阅读需 3 分钟
费奥多·菲茨纳 (Feodor Fitsner)
Flet 创始人和开发者

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

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

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

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

安装预发布版本

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

pip install flet --pre
信息

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

Flet版本控制

Flet将切换到语义化版本,版本号为 主版本.次版本.修订版本

  1. 当有“不兼容的API更改”时,将增加 主版本。现在它是 0,我们预计当Flet API足够稳定时将其设为 1
  2. 当以向后兼容的方式添加新功能时,将增加 次版本
  3. 当进行向后兼容的错误修复时,将增加 修订版本

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

Flet预发布版本的格式将为 主版本.{上一次次版本 + 1}.0.dev{构建},其中 上一次次版本 是上一个发布的 次版本{构建} 是由CI设置的构建号。例如,如果上次发布的版本是 0.1.65,预发布版本将具有版本 0.2.0.dev{构建}。发布 0.2.0 之后的预发布版本将标记为 0.3.0.dev{构建}

介绍 Flet

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

今天我们宣布 Flet 的第一个版本发布了!

Flet 是一个用于使用 Python 构建实时网络、桌面和移动应用的框架。

无需使用复杂的 JavaScript 前端、REST API 后端、数据库、缓存等架构。使用 Flet,你只需编写一个 Python 状态单体应用程序,即可获得多用户、实时单页应用程序 (SPA) 或移动应用程序。

要开始使用 Flet 开发,你只需要你喜欢的 IDE 或文本编辑器。无需 SDK,无需数千个依赖项,无需复杂的工具链——Flet 内置了带有资产托管的 Web 服务器和桌面客户端。

Flet UI 使用 Flutter 构建,因此你的应用程序看起来很专业,并且可以交付到任何平台。Flet 通过将较小的“widgets”组合成可立即使用的“controls”并采用命令式编程模型来简化 Flutter 模型。 你可以获得 Flutter 的所有强大功能,而无需学习 Dart!

Flet 应用程序作为常规 Web 应用程序部署,可以立即通过浏览器访问或安装为移动设备上的 PWA。Web 应用程序还公开了一个 API,可以被运行在 iOS 和 Android 上的 Flet 客户端(计划在未来版本中推出)使用,提供原生移动体验。

以下是一些示例:

试试 Flet告诉我们你的想法!