官方发布说明:medium.com/flutter/wha…
是时候再次迎来 Flutter 稳定版本的发布了,本次我们非常自豪地宣布 Flutter 3 的到来!三个月前我们官宣了 Flutter 对 Windows 的支持。今天我们很高兴地宣布,除 Windows 之外,Flutter 现已在 macOS 和 Linux 上稳定运行!
在此我们要感谢来自 Flutter 贡献者的大量贡献,本次更新囊括了 5248 个 Pull Request!
此次发布我们有几件激动人心的事情宣布,其中包括 Flutter 对 macOS 和 Linux 支持的更新、显着的性能改进、移动设备和 Web 平台更新等内容!此外,我们还有关于废弃旧版本 Windows 的支持以及一些破坏性改动的简述。让我们开始吧!
Flutter 已可用于所有桌面平台的生产应用
Linux 和 macOS 现已稳定支持开发和生产发布,其中新增了以下功能:
级联菜单和对 macOS 系统菜单栏的支持
你现在可以使用 PlatformMenuBar
widget 在 macOS 上创建平台菜单栏,它支持插入菜单到平台上,并且控制 macOS 应用程序菜单中显示的内容。
全面支持所有桌面平台上的国际文本输入
不同语言的使用 输入法 (IME) 的语言,例如中文、日文和韩文,在所有的桌面平台上都获得了全面的输入法支持,包括第三方输入法,例如搜狗和谷歌日文输入法。
所有桌面平台的无障碍访问功能
Flutter 支持 Windows、macOS 和 Linux 平台上的无障碍服务,包括屏幕阅读器、无障碍导航和反转颜色。
macOS 构建默认使用通用二进制文件
从 Flutter 3 开始,macOS 桌面的 Flutter 应用程序将构建为通用二进制文件,原生支持 Intel 的 Mac 和 Apple 最新的 Apple Silicon 设备。
弃用 Windows 7/8 开发
在此版本中,推荐的开发的 Windows 版本已提升至 Windows 10。虽然我们不会禁止开发者在旧版本(Windows 7、Windows 8、Windows 8.1)上进行开发,但 微软已不再支持 这些版本,我们仅对这些版本提供有限的测试。虽然我们将尽量为旧版本继续提供支持,但我们仍希望你尽快升级至 Windows 10 以上版本。
提醒:Flutter 会继续为在 Windows 7 和 Windows 8 上 运行 的 Flutter 应用程序提供支持,此更改仅影响 推荐 的开发环境。
移动平台的更新
此次移动平台的更新包括以下内容:
折叠屏手机的支持
Flutter 3 已支持折叠屏的移动设备。在微软发起的相关设备的合作中,其带来的新功能和 widget 可以让你在折叠屏设备上创建构建体验极佳的应用。
在这项改动中,MediaQuery
开始包含 DisplayFeatures
列表,用于描述显示部件的边界和状态,如铰链、折叠和刘海。此外,DisplayFeatureSubScreen
widget 现在在定位其子 widget 时,不会与 DisplayFeatures
的边界重叠,且已经适配了 Flutter 的对话框和弹出窗口,Flutter 能够立即感知和响应对应的 显示部件。
非常感谢微软的合作团队,尤其是 @andreidiaconu,感谢他们带来的贡献!
你可以体验 Surface Duo 的模拟器示例,其中包括一个 Flutter Gallery 特定分支的示例,以了解 Flutter 的双显示器的实际应用场景和表现。
iOS 可变刷新率支持
Flutter 现在已支持带有 ProMotion 显示屏的 iOS 设备(iPhone 13 Pro 和 iPad Pro)上的 可变刷新率。在这些设备上,Flutter 应用程序可以以 120Hz 的刷新率进行渲染,此前刷新率被限制为 60Hz。高刷新率会在快速动画(如滚动)的过程中为你带来更流畅的体验。想了解更多的详细信息,请参阅 支持可变刷新率的显示屏文档。
更简单的 iOS 构建及发布
我们 为 flutter build ipa
命令添加了新的选项,从而简化 iOS 应用程序的发布步骤。当你需要分发到 TestFlight 或 App Store 时,运行 flutter build ipa
以构建 Xcode 归档文件(.xcarchive
文件)和应用程序文件(.ipa
文件)。你可以使用 —-export-method ad-hoc
、—-export-method development
或 —-export-method enterprise
来构建不同的归档版本。构建应用程序包后,通过 Apple Transport macOS 应用程序 或在终端上使用 xcrun altool
将其上传到 Apple。上传完成后,应用就可以被发布到 TestFlight 或 App Store。配置好 Xcode 项目设置后,例如应用的显示名称和应用的图标,你无需再打开 Xcode 来发布你的应用。
Gradle 版本更新
如果你使用过 flutter_tools
创建新项目,你会注意到生成的文件现在使用的是最新版本的 Gradle 和 Android Gradle 插件 (AGP)。对于现有项目而言,你需要手动将版本升级到 Gradle 的 7.4 和 AGP 7.1.2。
弃用 32 位 iOS、iOS 9 及 iOS 10 版本的设备
我们曾在 2022 年 2 月发布的 2.10 稳定版本中宣布,Flutter 对 32 位 iOS 设备以及 iOS 9 和 10 版本的支持即将结束。此次更改将影响 iPhone 4S、iPhone 5、iPhone 5C 以及第二、第三和第四代的 iPad 设备。Flutter 3 是最后一个支持这些 iOS 版本和设备的稳定版本。
想要了解有关此更改的更多信息,请查看 RFC:End of support for 32-bit iOS devices。
Web 平台更新
此次 Web 平台应用的更新包括以下内容:
图像解码
Flutter Web 现在会在支持的浏览器中自动使用 ImageDecoder
API。截止到今天,大多数基于 Chromium 的浏览器(Chrome、Edge、Opera、三星浏览器等)都添加了此 API。
新的 API 使用浏览器的内置图像编解码器从主线程异步解码图像。图像解码速度因此提高了 2 倍,并且它从不阻塞主线程,从而消除了所有先前由图像引起的卡顿。
Web 应用的生命周期
Flutter Web 应用程序的新生命周期 API 让你可以灵活地从宿主 HTML 页面控制 Flutter 应用程序的初始化过程,并帮助 Lighthouse 分析你的应用程序的性能。这适用于许多场景:
- 启动画面。
- 加载指示器。
- 在 Flutter 应用程序之前显示的纯 HTML 交互式登录页面。
有关更多信息,阅读 自定义 Web 应用程序初始化。
工具更新
此次我们对 Flutter 和 Dart 工具的更新包括:
更新的 lint 包
lint 包的 2.0 版已发布:
使用 Flutter 3 创建的应用程序会在 flutter create
中自动使用 2.0 版本的 lints 集合。我们希望现有的应用程序、package 和插件迁移到 2.0 以遵循 Flutter 世界中最新和最有效的最佳实践。你可以运行 flutter pub upgrade --major-versions flutter_lints
进行升级。
2.0 版本中大多数新增的 lint 警告都带有自动修复。因此在你的应用程序的 pubspec.yaml
文件中升级到最新的包版本后,你可以运行 dart fix —-apply
以自动修复大多数 lint 警告(一些警告仍然需要一些手动操作解决)。尚未使用的应用程序、package 或插件可以按照 迁移指南 进行迁移。
性能改进
特别感谢开源贡献者 knopp,区域部分重绘已在支持它的 Android 设备上启用。在我们的本地测试中,Pixel 4 XL 设备在 backdrop_filter_perf
测试基准上的平均、第 90 个百分位和第 99 个百分位的构建帧光栅化时间减少了 5 倍。我们现在在 iOS 和更新的 Android 设备上都启用了单个矩形脏区域时存在时的部分重绘。
我们 进一步改进 了不透明动画在简单情况下的性能。具体来说,当一个 Opacity
小部件仅需要渲染一次时,通常被 Opacity
调用的 saveLayer
方法已被省略。在为这项修改构建的基准测试中,光栅化时间提高了一个数量级。我们计划在未来的版本中将此优化应用于更多场景。
特别感谢开源贡献者 JsouLiang 的贡献,现在在 Android 和 iOS 上 Flutter 引擎的 Raster 和 UI 线程运行的优先级将高于其他线程,例如 Dart VM 后台垃圾回收线程。在我们的基准测试中,这项改动让构建帧的平均构建时间 加快了约 20%。
在 Flutter 3 发布之前,光栅缓存的准入策略仅仅是查看图片中绘制操作的数量,任何具有多个操作的绘制操作都是好的缓存候选。实际上这导致了 Flutter 引擎花费更多内存来缓存渲染速度非常快的图片。在该版本中我们 引入了一种机制,它会根据绘制操作的成本来估计图片的渲染复杂性。将它用作光栅缓存准入策略 可以减少内存使用量,而不会降低我们基准测试的性能。
特别感谢开源贡献者 ColdPaleLight,他 修复了帧调度 中的一个错误,这个错误会导致在 iOS 上部分动画帧被丢弃。感谢所有报告此问题并提供丢帧的复制品和视频的人。
Impeller
Flutter 团队一直在努力探索解决 iOS 和其他平台上卡顿的解决方案。在 Flutter 3 中,你可以在 iOS 上预览一个名为 Impeller 的实验性渲染后端。Impeller 在 Flutter 引擎构建时会预编译 一组更小且更简单的着色器,这些着色器就不会在应用程序运行时再编译,这一直是导致 Flutter 卡顿的主要原因。 Impeller 远未达到应用于生产环境的条件,部分功能尚未完成,但我们对它在 Flutter gallery 应用中的保真度和性能感到非常满意。特别是 Gallery 应用的过渡动画中最差的构建帧构建速度快了大约 20 倍。
Impeller 在 iOS 上的可以使用参数启用。你可以在 flutter run
中使用 —-enable-impeller
,或将 Info.plist
文件中的 FLTEnableImpeller
标志设置为 true
以尝试 Impeller。我们会在 Flutter 的 master 渠道上继续开发 Impeller,希望能在未来的版本中提供进一步的更新。
Android 上的平台嵌入广告
当你使用 google_mobile_ads
package时,你会在用户的关键交互(例如页面之间的滚动和转换)时看到更好的性能,在主流机型上尤为明显。而这项改动最棒的部分是不需要更改任何代码!
在 Flutter 底层中,Flutter 现在将异步组合 Android View,通常也称为 PlatformView
。这意味着 Flutter 的光栅化线程不需要等待 Android View 渲染。相反,Flutter 引擎会使用它管理的 OpenGL 纹理,将 view 放置在屏幕上。
更多精彩更新
Flutter 生态系统的其他更新还包括:
Material 3
Flutter 3 已完整支持 Material Design 3,即下一代 Material Design。Flutter 3 为 Material 3 提供了可选支持,包括 Material You 功能(如动态颜色、更新的颜色系统和排版、许多 widget 的更新),以及 Android 12 中引入的新视觉效果(如新的触摸波纹设计和拉伸过度的滚动效果)。你可以在 新的 将枯燥无味的 Flutter 应用变得生动有趣 codelab 中尝试 Material 3 特性。你可以查阅 API 文档 了解如何使用 Material 3 的新特性和组件。你也可以订阅 Material 3 issue 跟踪 了解问题跟进的情况。
主题扩展
Flutter 现在可以使用 主题扩展 的概念向 Material 库的 ThemeData
添加 任何内容。你可以手动指定 ThemeData
.extensions,而无需扩展并重新实现其 copyWith
、lerp
和其他方法。此外,作为 package 开发人员,你可以对外提供 ThemeExtensions
。更多信息请参阅 ThemeExtension 提案 并 在 GitHub 上查看示例。
广告支持
我们甚至对于广告主而言,基于个性化广告征求同意并处理 Apple 的应用追踪透明度 (ATT) 要求非常重要。
为了支持这些要求,Google 提供了用户消息传递平台 (UMP) SDK,它取代了以前的开源 授权 SDK。在即将发布的谷歌移动广告 (GMA) Flutter SDK 中,我们将添加对 UMP SDK 的支持,广告主可以征求用户的同意。更多详细信息请查看 pub.dev 上的google_mobile_ads 页面。
破坏性改动
随着我们不断更新和改进 Flutter,我们的目标仍是尽量减少重大更改的数量。本次 Flutter 3 的发布有以下破坏性改动:
- 删除 2.10 已弃用的 API
- 页面转场替换为 ZoomPageTransitionsBuilder
- 替换 Chips 的 useDeleteButtonTooltip 为 deleteButtonTooltipMessage
- ThemeData 的 toggleableActiveColor 属性已被弃用
如果你正在使用这些 API,请参阅对应的 迁移指南。
总结
作为 Google 的 Flutter 团队,我们要感谢社区所做的出色工作,帮助 Flutter 维持其最受欢迎的跨平台 UI 工具包的地位。我们期待所有人作为一个社区共同努力,继续提供一个由社区驱动的工具,帮助为所有开发人员和用户创造愉快的体验!