嘿,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.txt
或 pyproject.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-runtime
、flet-embed
或flet-pyodide
,而是从requirements.txt
或pyproject.toml
中“按原样”安装所有依赖项——这要归功于新的 Flet 包结构。 - 如果未找到目标平台的二进制包,打包将不会尝试从源分布进行编译,而是会以有意义的错误失败。
Python 3.12
打包的 Flet 应用在所有平台上都在 Python 3.12.7 运行时上运行。
权限
新的 flet build
命令允许对嵌入到 AndroidManifest.xml
、Info.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_DATA
和 FLET_APP_STORAGE_TEMP
设置为它们的路径。
pyproject.toml
支持
将所有 flet build
设置作为命令行选项携带是不方便且繁琐的。
在 Flet 0.25.0 版本中,现在可以在 pyproject.toml
中配置 flet build
、flet run
和 flet 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-core
、flet-runtime
、flet-embed
或 flet-pyodide
包。
新的结构避免了在各种平台上安装 flet
包时重写 pip 依赖项。如果 flet
不是用户应用程序的直接依赖项,那么在安装时就会存在检测要安装的正确 flet
包(flet-runtime
、flet-embed
或 flet-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]
- 安装flet
、flet-cli
、flet-desktop
和flet-web
。推荐用于开发。flet[cli]
- 安装flet
和flet-cli
。可在 CI 环境中仅用于打包。flet[web]
- 安装flet
和flet-web
。用于部署 Flet Web 应用。flet[desktop]
- 安装flet
和flet-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
新控件
重大变更
- 将
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)。 - 将
icon
和icon_content
属性合并为icon: str | Control
(#4305)。 - 将
colors
和icons
变量迁移到枚举类型(Enums)中(#4180)。 TextField
:suffix_icon
、prefix_icon
和icon
可以是Control
或str
(#4173)。- 为
flet pack
CLI 命令添加了--pyinstaller-build-args
(#4187)。 - 使
SearchBar
的视图高度可调节;添加了新的属性(#4039)。 - 提升了
Rive
版本并修复了rive_common
的 Linux 应用构建模板。
Bug 修复:
- 修复了
Icon
的旋转问题(#4384)。 - 修复了使用
MarkdownCodeTheme
枚举时Markdown.code_theme
的回归问题(#4373)。 - 修复了
Segment
和NavigationBarDestination
仅接受字符串工具提示的问题(#4326)。 - 当
date
格式错误时显示信息性消息(#4019)。 - 修复了
MapConfiguration.interaction_configuration
未被遵守的问题(#3976)。 - 修复了
Video.jump_to()
在使用负索引时失败的问题(#4294)。 - 修复了
AppBar.tooltip_opacity
中的条件问题(#4280)。 - 修复了错误的类型(
asyncio.Future
到concurrent.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)。- 修复了按钮的
bgcolor
、color
和elevation
(#4126)。 - 修复了 Windows 上的滚动问题(#4145)。
- 如果
no_rich_output
为True
,则在 Windows 上跳过运行flutter doctor
(#4108)。 - 修复了
TextField
在 Linux Mint 上冻结的问题(#4422)。
结论 Flet 0.25.0 是一个重大版本,非常欢迎您的反馈!
升级到 Flet 0.25.0,测试您的应用程序,并告诉我们您对我们添加的新功能的看法。
如果您有任何问题,请加入Flet Discord 服务器或在Flet GitHub 讨论区创建一个新主题。 快乐地进行 Flet 开发!👾