跳到主要内容

Flet v0.25.0 版本发布公告

· 阅读需 16 分钟
Feodor Fitsner
Flet 创始人及开发者

嘿,Flet 开发者们,我们有一些令人兴奋的消息要分享——Flet 0.25.0 正式发布了!

最大的新闻是什么呢?iOS 和 Android 打包不再依赖 Kivy 了。不再需要处理令人沮丧的 Python 二进制依赖关系——Flet 现在使用其自己的自定义 Python 运行时,因此您的应用构建比以往任何时候都更容易。此外,我们还添加了许多新功能,如更好的权限控制、更快的重建,甚至还有一个轻量级的 Linux 客户端,避免了臃肿。

让我们深入了解 Flet 0.25.0 所提供的所有酷炫功能吧!🚀

如何升级

运行以下命令来升级 Flet:

pip install 'flet[all]' --upgrade
备注

[all] 是一个“额外”的指定符,它告诉 pip 安装所有 flet 包的依赖项。请参阅下面的新的 Python 包结构部分以了解解释。

requirements.txtpyproject.toml 中将 flet 包版本提升到 0.25.0(或者完全删除它以使用最新版本)。

新的打包方式

Flet 针对 iOS 和 Android 的打包一直依赖于 Kivy,当您的应用依赖于 Python 二进制包(如 Numpy 或 Pillow)时,这会非常烦人。您需要使用 Kivy 命令行工具自己编译这些包。如果 Kivy 没有某些包(如 Pydantic)的“配方”,那真的会让人感到沮丧甚至绝望。

Flet 不再依赖 Kivy,而是使用其自己在内部精心制作的 Python 运行时。

Flet 针对 iOS 和 Android 的打包实现遵循了 PEP 730(iOS)和 PEP 738(Android)中定义的严格规范,这些规范在 Python 3.13 中实现并发布(并回溯到 Python 3.12)。当 pypi.org 支持 iOS 和 Android 的 wheel 标签,并且第三方 Python 包维护者开始上传他们的移动包时,Flet 将与它们兼容,您将能够在您的 Flet 应用中使用它们。

预构建的二进制包

针对 iOS 和 Android 的 flet build 命令现在从 https://pypi.flet.dev 安装预构建的二进制包。

可以通过在 Mobile Forge 项目中创建配方来构建新的包。目前,Flet 团队正在为您编写这些配方,但当该过程经过完善并完全自动化后,您将能够发送 PR 并立即测试编译后的包。

如果您在 https://pypi.flet.dev 上还没有看到您需要的包,您可以在 Flet 讨论 - 包 中提出请求。请不要请求纯 Python 包。在 https://pypi.org 上转到包的“下载文件”部分,并确保它包含特定于二进制平台的 wheel。

打包行为也发生了变化:

  • 打包不再尝试将 flet 依赖替换为 flet-runtimeflet-embedflet-pyodide,而是从 requirements.txtpyproject.toml 中“按原样”安装所有依赖项——这要归功于新的 Flet 包结构
  • 如果未找到目标平台的二进制包,打包将不会尝试从源分布进行编译,而是会以有意义的错误失败。

Python 3.12

打包的 Flet 应用在所有平台上都在 Python 3.12.7 运行时上运行。

权限

新的 flet build 命令允许对嵌入到 AndroidManifest.xmlInfo.plist.entitlements 文件中的权限、功能和授权进行精细控制。

这些文件中不再有硬编码的权限!

例如,为 iOS 捆绑包设置权限:

flet build --info-plist NSLocationWhenInUseUsageDescription="此应用在使用时使用位置服务。"

或者在 pyproject.toml 中进行相同的设置(请阅读下文关于 pyproject.toml 支持的内容):

[tool.flet.ios.info] # --info-plist
NSLocationWhenInUseUsageDescription = "此应用在使用时会使用定位服务。"

设置 Android 权限和功能的示例:

flet build \
--android-permissions android.permission.READ_EXTERNAL_STORAGE=True \
android.permission.WRITE_EXTERNAL_STORAGE=True \
--android-features android.hardware.location.network=False

在文档中阅读更多关于权限的内容

对应用编译和清理的控制

默认情况下,flet build 命令不再将应用的 .py 文件编译为 .pyc 文件,这使您能够推迟发现应用中的任何语法错误并完成打包。

您可以使用以下新选项来控制编译和清理:

  • --compile-app - 编译应用的 .py 文件。
  • --compile-packages - 编译已安装包的 .py 文件。
  • --cleanup-on-compile - 在成功编译后删除不必要的文件。

为 Android 捆绑包签名

我们还为 Android 构建添加了新的签名选项:

  • --android-signing-key-store - Android 应用的上传密钥库 .jks 文件的路径。
  • --android-signing-key-store-password - Android 签名存储密码。
  • --android-signing-key-alias - Android 签名密钥别名。默认是 "upload"。
  • --android-signing-key-password - Android 签名密钥密码。

阅读 构建和发布 Android 应用,以获取有关如何为 Android 构建配置上传密钥的更多信息。

深度链接配置

有一个新的 --deep-linking-url 选项可用于为 iOS 和 Android 构建配置深度链接。该值必须采用 <sheme>://<host> 的格式。

更快的重新构建

flet build 命令创建的临时 Flutter 应用不再在每次构建时在临时目录中重新创建,而是缓存在 build/flutter 目录中,这使得重新构建更快,改善了打包故障排除,并且不会污染用户的临时目录。

不过,您可以使用 --clear-cache 选项进行干净的构建。

按 ABI 拆分 APK

flet build 现在提供了内置的 --split-per-abi 选项,以按 ABI 拆分 APK。

应用的“数据”和“临时”目录

Flet 开发人员一直在询问在哪里存储应用数据,例如上传的文件、SQLite 数据库等,这些数据在应用更新期间是持久的。

此版本引入了两个在您的 Flet 应用中可用的环境变量:

  • FLET_APP_STORAGE_DATA - 用于存储在应用更新之间保留的应用数据的目录。该目录已经预先创建,其位置取决于应用运行的平台。
  • FLET_APP_STORAGE_TEMP - 用于临时应用文件(即缓存)的目录。该目录已经预先创建,其位置取决于应用运行的平台。

例如,您可以在应用中按如下方式读取数据文件夹路径:

import os

# 在 Web 模式下运行应用时,它为 `None`
data_dir = os.getenv("FLET_APP_STORAGE_DATA")

:::注意 flet run 命令会创建数据和临时目录,并将 FLET_APP_STORAGE_DATAFLET_APP_STORAGE_TEMP 设置为它们的路径。 :::

pyproject.toml 支持

将所有 flet build 设置作为命令行选项携带是不方便且繁琐的。

在 Flet 0.25.0 版本中,现在可以在 pyproject.toml 中配置 flet buildflet runflet publish 设置!

Flet 会在 pyproject.toml 中添加 tool.flet 部分和子部分。以下是您可以放入应用根文件夹的 pyproject.toml 的最小版本:

[project]
name = "my_app"
version = "1.0.0"
description = "我的第一个 Flet 项目"
authors = [
{name = "John Smith", email = "john@email.com"}
]
dependencies = ["flet"]

您还可以使用 flet create 命令为您的项目生成一个起始的 pyproject.toml(以及其他文件)。

新的 Python 包结构

我们对 Flet Python 包进行了重构,并移除了 flet-coreflet-runtimeflet-embedflet-pyodide 包。

新的结构避免了在各种平台上安装 flet 包时重写 pip 依赖项。如果 flet 不是用户应用程序的直接依赖项,那么在安装时就会存在检测要安装的正确 flet 包(flet-runtimeflet-embedflet-pyodide?)的问题。

新的 Flet 包:

  • flet - 进行最小 Flet 设置所需,是各种平台的应用程序入口点,包含核心逻辑和控件。在所有平台上安装。
  • flet-cli - 包含 Flet CLI 命令。仅在桌面端安装。
  • flet-desktop - 包含适用于 macOS、Windows 和 Linux 的预构建 Flet“客户端”应用程序二进制文件。默认情况下仅在 macOS 和 Windows 桌面上安装。
  • flet-desktop-light - 包含适用于 Linux 的轻量级版本(不含音频和视频控件)的 Flet“客户端”。默认情况下仅在 Linux 桌面上安装。
  • flet-web - 包含 Flet Web“客户端”和 FastAPI 集成。仅在桌面端安装。

打包的 Flet 应用现在只包含 flet 包。

flet 包的额外功能

flet 包定义了以下额外功能,在使用 pip、uv、poetry 和其他包管理器安装 Flet 时可以指定:

  • flet[all] - 安装 fletflet-cliflet-desktopflet-web。推荐用于开发。
  • flet[cli] - 安装 fletflet-cli。可在 CI 环境中仅用于打包。
  • flet[web] - 安装 fletflet-web。用于部署 Flet Web 应用。
  • flet[desktop] - 安装 fletflet-desktop。用于仅桌面端的开发。

新的 Flet 安装和升级命令

从此版本开始,flet 包的开发版本应使用以下命令安装:

pip install 'flet[all]'

升级 flet 包:

pip install 'flet[all]' --upgrade

:::注意 pip install flet 仍然可以使用,但它将仅安装 flet 包,而依赖包将根据需要进行安装。例如,当您运行任何 flet CLI 命令时,将安装 flet-cli,或者当您运行 flet run 命令时,将安装 flet-desktop 包。 :::

Linux 的“轻量级”客户端

默认情况下,现在在 Linux 上安装的是一个不含音频和视频控件的轻量级桌面客户端。这改善了初始用户体验,因为用户不需要立即处理 gstreamer(音频)和 mpv(视频)的依赖项,Flet “即可正常工作”。

一旦用户获得了一些 Flet 经验并希望在其应用程序中使用视频和音频控件,他们可以安装 gstreamer 和/或 mpv,并将 Flet 桌面客户端替换为完整版本。

卸载“轻量级”Flet 客户端:

pip uninstall flet-desktop-light --yes

安装完整的 Flet 桌面客户端:

pip install flet-desktop

新控件

  • 移动广告(BannerInterstitial)(详细信息和示例)。
  • Button 控件(#4265) - 它只是 ElevatedButton 控件的别名。

重大变更

  • Badge 控件重构为数据类;向所有控件添加了新的 badge 属性(#4077)。

以下是如何迁移:

# 之前
page.navigation_bar = ft.NavigationBar(
destinations=[
ft.NavigationBarDestination(
icon_content=ft.Badge(
content=ft.Icon(ft.Icons.PHONE),
text=10,
),
label="Calls",
),
]
)

# 之后
page.navigation_bar = ft.NavigationBar(
destinations=[
ft.NavigationBarDestination(
icon=ft.Icon(
ft.Icons.PHONE,
badge="10",
),
label="Calls",
),
]
)

其他变更

新增内容

  • TextField.counter_text 中添加了 {value_length}{max_length}{symbols_left} 占位符(#4403)。
  • 在构建命令行界面(cli)命令中添加了 --skip-flutter-doctor#4388)。
  • 增强了 WebView#4018)。
  • 增强了 Map 控件(#3994)。
  • 暴露了更多的 Theme 属性(#4278#4278)。
  • 在多个控件中暴露了更多属性(#4105)。
  • 在类似容器的控件中添加了 __contains__ 方法(#4374)。
  • 添加了自定义的 Markdown 代码主题(#4343)。
  • 为对话框添加了 barrier_color 属性(#4236)。
  • iconicon_content 属性合并为 icon: str | Control#4305)。
  • colorsicons 变量迁移到枚举类型(Enums)中(#4180)。
  • TextFieldsuffix_iconprefix_iconicon 可以是 Controlstr#4173)。
  • flet pack CLI 命令添加了 --pyinstaller-build-args#4187)。
  • 使 SearchBar 的视图高度可调节;添加了新的属性(#4039)。
  • 提升了 Rive 版本并修复了 rive_common 的 Linux 应用构建模板。

Bug 修复

  • 修复了 Icon 的旋转问题(#4384)。
  • 修复了使用 MarkdownCodeTheme 枚举时 Markdown.code_theme 的回归问题(#4373)。
  • 修复了 SegmentNavigationBarDestination 仅接受字符串工具提示的问题(#4326)。
  • date 格式错误时显示信息性消息(#4019)。
  • 修复了 MapConfiguration.interaction_configuration 未被遵守的问题(#3976)。
  • 修复了 Video.jump_to() 在使用负索引时失败的问题(#4294)。
  • 修复了 AppBar.tooltip_opacity 中的条件问题(#4280)。
  • 修复了错误的类型(asyncio.Futureconcurrent.futures.Future)并处理了 CancelledError#4268)。
  • 修复了点击 CupertinoContextMenuAction 时上下文菜单未关闭的问题(#3948)。
  • 修复了下拉菜单的 max_menu_height 问题(#3974)。
  • 修复了在 before_update() 中防止按钮样式被修改的问题(#4181)。
  • 修复了禁用填充按钮在视觉上未被尊重的问题(#4090)。
  • 当设置了 label 时,为 Row 使用 MainAxisSize.min#3998)。
  • 修复了 NavigationBarDestination.disabled 没有视觉效果的问题(#4073)。
  • 修复了 CupertinoTextField 中的自动填充问题(#4103)。
  • Linechart:在显示之前对工具提示进行 jsonDecode#4069)。
  • 修复了按钮的 bgcolorcolorelevation#4126)。
  • 修复了 Windows 上的滚动问题(#4145)。
  • 如果 no_rich_outputTrue,则在 Windows 上跳过运行 flutter doctor#4108)。
  • 修复了 TextField 在 Linux Mint 上冻结的问题(#4422)。

结论 Flet 0.25.0 是一个重大版本,非常欢迎您的反馈!

升级到 Flet 0.25.0,测试您的应用程序,并告诉我们您对我们添加的新功能的看法。

如果您有任何问题,请加入Flet Discord 服务器或在Flet GitHub 讨论区创建一个新主题。 快乐地进行 Flet 开发!👾