Flutter 3 发布 | macOS/Linux 稳定支持、性能改进、Impeller、折叠屏 & Material 3 支持

官方发布说明:medium.com/flutter/wha…

是时候再次迎来 Flutter 稳定版本的发布了,本次我们非常自豪地宣布 Flutter 3 的到来!三个月前我们官宣了 Flutter 对 Windows 的支持。今天我们很高兴地宣布,除 Windows 之外,Flutter 现已在 macOS 和 Linux 上稳定运行!

Flutter 3 发布 | macOS/Linux 稳定支持、性能改进、Impeller、折叠屏 & Material 3 支持

在此我们要感谢来自 Flutter 贡献者的大量贡献,本次更新囊括了 5248 个 Pull Request!

此次发布我们有几件激动人心的事情宣布,其中包括 Flutter 对 macOS 和 Linux 支持的更新、显着的性能改进、移动设备和 Web 平台更新等内容!此外,我们还有关于废弃旧版本 Windows 的支持以及一些破坏性改动的简述。让我们开始吧!

Flutter 已可用于所有桌面平台的生产应用

Linux 和 macOS 现已稳定支持开发和生产发布,其中新增了以下功能:

级联菜单和对 macOS 系统菜单栏的支持

你现在可以使用 PlatformMenuBar widget 在 macOS 上创建平台菜单栏,它支持插入菜单到平台上,并且控制 macOS 应用程序菜单中显示的内容。

Flutter 3 发布 | macOS/Linux 稳定支持、性能改进、Impeller、折叠屏 & Material 3 支持

全面支持所有桌面平台上的国际文本输入

不同语言的使用 输入法 (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 能够立即感知和响应对应的 显示部件

Flutter 3 发布 | macOS/Linux 稳定支持、性能改进、Impeller、折叠屏 & Material 3 支持

非常感谢微软的合作团队,尤其是 @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,而无需扩展并重新实现其 copyWithlerp 和其他方法。此外,作为 package 开发人员,你可以对外提供 ThemeExtensions。更多信息请参阅 ThemeExtension 提案在 GitHub 上查看示例

广告支持

我们甚至对于广告主而言,基于个性化广告征求同意并处理 Apple 的应用追踪透明度 (ATT) 要求非常重要。

为了支持这些要求,Google 提供了用户消息传递平台 (UMP) SDK,它取代了以前的开源 授权 SDK。在即将发布的谷歌移动广告 (GMA) Flutter SDK 中,我们将添加对 UMP SDK 的支持,广告主可以征求用户的同意。更多详细信息请查看 pub.dev 上的google_mobile_ads 页面。

破坏性改动

随着我们不断更新和改进 Flutter,我们的目标仍是尽量减少重大更改的数量。本次 Flutter 3 的发布有以下破坏性改动:

如果你正在使用这些 API,请参阅对应的 迁移指南

总结

作为 Google 的 Flutter 团队,我们要感谢社区所做的出色工作,帮助 Flutter 维持其最受欢迎的跨平台 UI 工具包的地位。我们期待所有人作为一个社区共同努力,继续提供一个由社区驱动的工具,帮助为所有开发人员和用户创造愉快的体验!

发表评论

相关文章