Flutter 2.10 | 稳定支持 Windows、性能改进、Material 3 更新

19,730 阅读10分钟

编者按:新年快乐~ 自上一次 Flutter 发布 2.8 稳定版仅过去了 2 个月,Flutter 就再次发布了 2.10 版本。尽管我们正处于春节期间,但是也不要忘了学习噢~

官方发布文章:medium.com/flutter/wha…

欢迎来到 Flutter 2.10。虽然⾃上次稳定版本发布以来还不到两个⽉,但即使在这么短的时间内,我们也已经关闭了 1843 个问题,合并了来⾃全球 155 位贡献者的 1525 个 PR。感谢⼤家在 2021 年末的假期期间作出的出⾊⼯作。

我们有⼏件令⼈兴奋的事情要宣布,包括 Flutter 对 Windows ⽀持的重⼤更新、⼏项重⼤的性能改进、对框架中图标和颜⾊的新⽀持,以及一些⼯具改进。此外,该版本还包括移除了 dev 渠道的更新、减少对旧版 iOS 的⽀持以及简短的重⼤更改列表。让我们开始吧!

Windows 支持已进入稳定阶段

⾸先,Flutter 2.10 版本带来了稳定的 Windows ⽀持。你再也不需要通过单独配置 Windows 支持来获得创建 Windows 应⽤程序的能力,它已被默认启⽤!

Flutter for Windows

当然,我们所做的不仅仅是反转一个配置。这个版本的 Windows 支持中,包含了对⽂本处理、键盘处理和键盘快捷键的⼴泛改进,以及直接与 Windows 集成的新方式、⽀持命令行参数、全球化⽂本输⼊和无障碍功能。

有关 Windows 稳定版发布的更多信息,可以阅读 正式发布 Flutter for Windows ⽂章,它描述了 Flutter 在 Windows 上的架构,同时说明了有多少 Flutter package 和插件已经⽀持 Windows。你还可以查看我们的⼯具和应⽤合作伙伴在 Windows 上使⽤ Flutter 制作的一些⽰例。

性能改进

此版本的 Flutter 包括由 Flutter 社区成员 knopp 提供的 绘制脏区管理 的初步⽀持。他为 iOS/Metal 上的单个脏区域启⽤了选择性重绘。这一变化将一些基准测试中九十分位和九十九分位的光栅化时间减少了一个数量级,并将这些基准测试中的 GPU 利⽤率从 90% 以上降低到了 10% 以下。

优化后的 Skia 渲染基准测试数据

我们期望将选择性重绘的好处在未来的版本中带到 其他平台

在 Flutter 2.8 版本中,我们 添加了⾃⼰内部的记录格式。而在 Flutter 2.10 中,我们已经开始使⽤它 (DisplayList) 进行优化。例如,一种常见不透明层的情况现在已经 以更高效的方式实现。即使在最坏的情况下,在我们基准测试中每帧光栅化时间也下降到了先前的三分之一以下。

优化后的 Skia 渲染基准测试数据

随着我们继续开发记录格式,将来会继续将该优化扩展到更多的场景。

在 profile 和 release 模式下,Dart 代码将以 AOT 方式编译。这段代码的轻量和高效的关键来源于整个程序的类型流分析,它解锁了许多编译器优化和激进的摇树优化 (tree-shaking)。但由于类型流分析必须涵盖整个程序,因此可能会有些消耗性能。新版本带来了 更快的类型流分析实现。在我们的基准测试中,Flutter 应⽤程序的总体构建时间下降了约 10%。

优化后的构建时间

与往常一样,性能增强、减少内存使⽤和减少延迟是 Flutter 团队的⾸要任务。期待未来版本的进一步改进。

iOS 更新

除了性能改进之外,我们还添加并增强了一些特定平台的功能。luckysmg 就为我们带来了一项 iOS 上新的增强功能——更流畅的键盘动画,它会⾃动应用在你的应用中。

iOS 键盘过渡动画

除此以外,我们还通过修复一些 边缘情况崩溃提⾼了 iOS 相机插件的稳定性

最后,64 位 iOS 架构获得了减少内存使⽤的新功能:压缩指针

64 位架构将指针表⽰为 4 字节大小的数据结构。当你有很多对象时,指针本⾝占⽤的空间会增加应⽤程序的整体内存使⽤量,特别是如果你的应⽤程序更大、更复杂时,这些应⽤程序有更多的 GC 抖动。但是,你的 iOS 应⽤程序不太可能有⾜够的对象来占⽤大部分的 32 位地址空间(20 亿个对象),更不⽤说庞⼤的 64 位地址空间(900 亿个对象)了。

Dart 2.15 中引入了压缩指针的功能,在这次发布的 Flutter 版本中,我们使⽤这项功能来减少 64 位 iOS 应⽤程序的内存使⽤量。你可以查看 Dart 2.15 博客⽂章 了解详细信息。

Android 更新

此版本还包含许多针对 Android 的改进。现在在默认情况下,当你创建新应⽤时,Flutter 默认⽀持最新版本的 Android,即 Android 12(API 级别 31)。此外,在此版本中,我们启⽤了 multidex ⾃动⽀持。如果你的应⽤⽀持低于 21 的 Android SDK 版本,并且超过了 64K 的 dex ⽅法数限制,只需将 --multidex 参数传递给 flutter build appbundleflutter build apk 命令,你的应⽤就会增加 multidex 的⽀持。

最后,在我们收到开发者们对于 Gradle 抛出让人费解的错误消息的反馈后,我们调整了 Flutter 工具,现在它将 提供常⻅问题的解决方法的提示。例如,如果你向你的应⽤添加了一个插件,该插件需要你提⾼最低支持的 Android SDK 版本,你现在会在错误信息中看到「Flutter Fix」的建议。

Gradle 错误提示

我们将继续为常⻅错误消息添加更多建议,并希望获得你对其他错误消息的反馈,这些错误消息将显著帮助开发者处理同类问题。

Web 平台更新

此版本还包含对 Web 平台的一些改进。例如,在以前的版本中,当鼠标拖动到多行文本框的边缘时,它不会正确地跟随滚动。在此版本中,当选择光标拖出了文本框时,文本框会进行滚动,浏览并选中对应的文字内容。此行为同时适⽤于 Web 平台和桌⾯应⽤程序。

在 Web 平台选中并拖拽 TextField 光标

此外,此版本的 Flutter 还包括对 Web 的另一项显着改进。我们一直在寻求减少将 Flutter 映射到 Web 的开销。在以前的版本中,每次我们想要将原⽣ HTML 的 widget 引⼊ Flutter 应⽤程序时,我们都需要一个覆盖层 (Overlay) 作为我们对 Web 的平台视图 (Platform view) ⽀持的一部分。这些叠加层中的每一个都⽀持⾃定义绘制,但同时也代表了一定数量的性能开销。如果你的应⽤程序中有⼤量原⽣ HTML 的 widget,例如链接,那么这将产生可观的性能开销。在这个版本中,我们为 Web 平台构建了一个新的「⾮绘制的平台视图」,基本上消除了这种开销。我们已经 利⽤了这种优化Link widget 中,这意味着如果你的 Flutter Web 应⽤程序中有⼤量的链接,它们将不再产生额外的性能消耗。随着时间的推移,我们会将此优化应⽤到其他的 widget。

Material 3

此版本是向 Material 3 过渡的开始,其中包括 从单一种⼦颜⾊⽣成整个配⾊⽅案 的能力。

Material 3 的 ColorScheme

你可以使用任意颜色来创建新的 ColorScheme 类型:

final lightScheme = ColorScheme.fromSeed(seedColor: Colors.green);
final darkScheme = ColorScheme.fromSeed(seedColor: Colors.green, brightness: Brightness.dark);

ThemeData 的构造函数还有一个新的 colorSchemeSeed 参数,可以直接从颜色⽣成主题的配⾊⽅案:

final lightTheme = ThemeData(colorSchemeSeed: Colors.orange, ...); 
final darkTheme = ThemeData(colorSchemeSeed: Colors.orange, brightness: Brightness.dark, ...); 

此外,此版本包括了 ThemeData.useMaterial3 的参数,它可以将 widget 切换到新的 Material 3 外观

最后,我们添加了 1,028 个新的 Material 图标

1028 个图标的部分预览

你可以在 这个 issue 中 跟进 Material 3 的接入情况,并随时留下你的意见反馈。

集成测试改进

2020 年 12 ⽉,我们宣布了 使⽤ integration_test 进行端到端测试的新⽅法。这个新的 package 取代了 flutter_driver 作为进行集成测试的推荐⽅式,提供了新功能,如 Firebase 测试实验室⽀持以及对 Web 和桌⾯的⽀持。

从那时起,我们对集成测试的内容进行了进一步改进,包括 将 integration_test 包捆绑到 Flutter SDK 中,使其更容易与你的应⽤程序集成。现在,我们撰写了一份新的迁移指南,帮助你 从 flutter_driver 测试迁移到 integration_test

新的 flutter_driver 至 integration_test 的迁移指南

现有的⽂档示例codelab 也已针对 integration_test 进行了更新。如果你还没有在 Flutter 应⽤程序上使⽤ integration_test,那么可以从现在开始!

DevTools

在这个版本中,我们也在 Flutter DevTools 上做了一些改进⼯作,包括从命令行直接使⽤ DevTools 的简易功能。现在你⽆需使⽤ pub global activate 来下载和运行最新版本的 devtools,只需简单地使⽤ dart devtools 获取与你正在使⽤的 Flutter 版本一致的最新版本即可。

我们还进行了一些 可⽤性更新,包括 改进在调试器变量窗格中检查⼤型列表和映射 的⽀持(感谢艾莉特)。

在 DevTools 中查看大型列表和映射

最后,我们即将发布年度 DevTools 问卷调查!请提供你的反馈并帮助我们改善你的开发体验。

2022 年度 DevTools 问卷调查

该调查提⽰将在 2 ⽉中旬的某个时间直接显⽰在 DevTools 中。

VSCode 改进

Flutter 的 Visual Studio Code 扩展也获得了许多增强功能,包括 在代码的更多位置预览颜色 以及 可更新颜色代码的颜⾊选择器

VSCode 的 Flutter 颜色选择器

此外,如果你想成为 VSCode 的 Dart 和 Flutter 扩展的预发布版本的测试⼈员,你可以 在你的扩展设置中切换到预发布版本

使用预发布版本的插件

你可以在 这篇⽂章中 阅读有关此更新的详细信息。

删除 dev 渠道

在 Flutter 2.8 版本中,我们宣布我们正在努力移除 dev 渠道,简化你的选择并减少研发的开销。在这个版本中,我们已经完成了这项⼯作,包括:

  • 更新 Flutter ⼯具以帮助将开发⼈员迁移出开发频道
  • 更新 wiki 对于各个渠道的说明和承诺
  • 更新弃⽤政策
  • 从 DartPad、预提交测试和⽹站中删除 dev 渠道的⽀持

Dev 渠道现已被彻底移除。如果我们漏了一些没有移除的位置,请告诉我们。

对 iOS 9.3.6 的⽀持进入尾声

由于我们实验室中⽬标设备的使⽤减少和维护难度增加,我们正在 调整对于 iOS 9.3.6 的支持从「⽀持」到「尽力⽽为」。这意味着对 iOS 9.3.6 的⽀持和对 32 位 iOS 设备的⽀持将仅通过编码实践、Ad-Hoc 和社区测试来维持。

我们预计在 2022 年第三季度的 Flutter 稳定版本中放弃对 32 位 iOS 设备以及 iOS 版本 9 和 10 的 ⽀持。这意味着基于稳定的 Flutter SDK 构建的应⽤程序将不再在 32 位 iOS 设备上运行,并且 Flutter ⽀持 的最低 iOS 版本将增加到 iOS 11。

破坏性改动

我们还努力在每个版本和此版本中减少破坏性改动,尽管我们还没有完全归零,但我们会继续努力!

如果你仍在使⽤这些 API,可以阅读 flutter.dev 上的迁移指南。一如既往,⾮常感谢社区贡献测试,帮助我们识别这些破坏性改动。

总结

谨代表 Google Flutter 团队的所有⼈,说一声————谢谢。感谢你成为社区的一员,有了社区的帮助,Flutter 才能成为最受欢迎的跨平台 UI 工具。尽管对 Windows 的稳定⽀持才刚刚开始,但我们已经开始期待我们将共同构建的一切!