第6章 Flutter 2.10 版本发布:Windows 稳定版支持、性能优化与 Material 3 更新
Flutter 2.10 有什么新功能 Windows 稳定版支持、性能改进、Material 3 更新等等! Chris Sells 2022 年 2 月 3 日 · 11 分钟阅读 rss_feed Share on X Share on Bluesky Share on LinkedIn 真不敢想象又到了 Flutter 稳定版发布的时候了!大家好,欢迎来到 Flutter 2.10。距离上次发布还不到两个月,但就在这么短的时间里,我们关闭了 1,843 个 issue,合并了来自全球 155 位贡献者的 1,525 个 PR。感谢大家的辛勤付出,尤其是在 2021 年的假日季。 本次发布有多项激动人心的内容,包括 Flutter 对 Windows 支持的重大更新、若干显著的性能改进、框架中对图标和颜色的新支持,以及一些工具链改进。此外,还有关于移除 dev channel、降低对旧版 iOS 的支持力度,以及一小部分破坏性变更的更新。废话不多说,开始吧! Windows 生产级应用就绪 首先也是最重要的,Flutter 2.10 带来了 Windows 支持的稳定版。你不再需要手动开启 flag 才能在 Flutter stable channel 上构建 Windows 应用——现在默认可用! 当然,我们做的远不止切换一个开关。本次发布在文本处理、键盘处理和快捷键方面都有大量改进,还新增了与 Windows 的直接集成,支持命令行参数、全球化文本输入以及无障碍功能。 想深入了解 Windows 稳定版的发布,请阅读 Announcing Flutter for Windows 博客文章,其中介绍了 Flutter 在 Windows 上的架构如何实现深度集成,也让你了解到已支持 Windows 的 Flutter packages 和 plugins 有多少。你还可以看看我们的工具和应用合作伙伴正在用 Flutter on Windows 做些什么! 性能改进 本次发布包含了由 Flutter 社区成员 knopp 提供的 dirty region 管理的初步支持。他在 iOS/Metal 上实现了单个 dirty region 的局部重绘。这一改动让几项基准测试中 90 和 99 百分位的栅格化时间降低了一个数量级,GPU 利用率也从超过 90% 降到了不到 10%。 我们预计在未来版本中将局部重绘的优势扩展到其他平台。 在 Flutter 2.8 发布时,我们实现了自己的内部 picture recording 格式。到了 Flutter 2.10,我们开始基于它构建优化。举个例子,opacity layers 的一种常见场景现在的实现效率大幅提升。即使在最坏情况下,我们基准测试中的帧栅格化时间也降到了原先的三分之一以下。 随着 picture recording 格式的持续开发,我们预计这项优化将覆盖更多场景。 在 profile 和 release 模式下,Dart 代码会提前编译为原生机器码。这种代码高效且体积小的关键在于全程序的 type flow 分析,它解锁了众多编译器优化和激进的 tree-shaking。不过,由于 type flow 分析需要覆盖整个程序,开销可能比较大。本次发布包含了更快的 type flow 分析实现。在我们的基准测试中,Flutter 应用的整体构建时间缩短了约 10%。 一如既往,性能提升、内存占用降低和延迟减少始终是 Flutter 团队的优先事项。期待未来版本的进一步改进。 iOS 更新 除了性能改进,我们还添加了一些平台专属的功能和增强。其中一项新增强是来自 luckysmg 的 iOS 更流畅的键盘动画,你的应用无需任何改动即可自动获得。 我们还通过修复一些边缘情况的崩溃,提升了 iOS 相机插件的稳定性。 最后,64 位 iOS 架构获得了一项减少内存占用的新功能:compressed pointers。 64 位架构用 8 字节的数据结构来表示指针。当对象很多时,指针本身占用的空间会增加应用的整体内存开销,对于更大更复杂、GC 压力更大的应用尤其明显。然而,你的 iOS 应用几乎不可能有足够多的对象需要用到 32 位地址空间的相当一部分(20 亿个对象),更不用说庞大的 64 位地址空间(9000 万亿个对象)了。 Compressed pointers 在 Dart 2.15 中就已提供,而在本次 Flutter 发布中,我们利用它来降低 64 位 iOS 应用的内存占用。详情请查阅 Dart 2.15 博客文章。 既然在看 Dart 的博客文章,别忘了看看 Dart 2.16 发布公告,了解通过 package platform tagging 支持 Flutter for Windows 的更新,以及 pub.dev 上的新搜索体验。 Android 更新 本次发布对 Android 也做了多项改进。默认情况下,新建应用时 Flutter 默认支持最新版 Android,即版本 12(API level 31)。此外,本次发布还自动启用了 multidex 支持。如果你的应用支持 Android SDK 21 以下版本,并且超过了 64K 方法数上限,只需给 flutter build appbundle 或 flutter build apk 传入 --multidex 标志,你的应用就能支持 multidex。 最后同样重要的是,我们听到了你们的反馈:Gradle 的错误信息实在太吓人了。因此,Flutter 工具现在会针对常见问题给出解决步骤。比如,当你给应用添加一个需要提高最低支持 Android SDK 版本的 plugin 时,日志中现在会出现“Flutter Fix”建议。 我们会继续为常见的错误信息添加更多建议,也欢迎大家反馈哪些错误信息适合采用这种处理方式。 Web 更新 本次发布在 Web 端也有一些改进。例如,在之前的版本中,在 Web 上滚动多行 TextField 到边缘时,无法正确滚动。本次发布引入了文本选择的边缘滚动:当选择移动到文本框之外时,文本框会滚动以显示滚动范围。这一新行为同时适用于 Web 和桌面应用。 此外,本次 Flutter 发布在 Web 上还有另一项显著改进。我们一直在努力降低 Flutter 映射到 Web 的开销。在之前的版本中,每次想在 Flutter 应用中引入原生 HTML widget,都需要一个 overlay 作为 Web 平台视图支持的一部分。每个 overlay 都支持自定义绘制,但也带来一定的开销。如果你的应用里有大量原生 HTML widget(比如链接),开销就会累积起来。本次发布中,我们为 Web 创建了一种新的“non-painting platform view”,基本上消除了这种开销。我们已经在 Link widget 中应用了这一优化,这意味着即使你的 Flutter Web 应用中有很多链接,也不会再带来明显的开销。我们会逐步将这项优化应用到其他 widget。 Material 3 本次发布是向 Material 3 过渡的开端,包括通过单一 seed color 生成完整 color scheme 的能力。 用任意颜色,你都可以构造新的 ColorScheme 类型的实例: dart final lightScheme = ColorScheme.fromSeed(seedColor: Colors.green); final darkScheme = ColorScheme.fromSeed(seedColor: Colors.green, brightness: Brightness.dark); ThemeData 工厂构造函数也新增了 colorSchemeSeed 参数,用于生成主题的 color scheme: dart final lightTheme = ThemeData(colorSchemeSeed: Colors.orange, …); final darkTheme = ThemeData(colorSchemeSeed: Colors.orange, brightness: Brightness.dark, …); 此外,本次发布还包含 ThemeData.useMaterial3 标志,可将组件切换到新的 Material 3 外观。 最后,我们还新增了 1,028 个 Material 图标。 1,028 个新 Material 图标中的一小部分 更新详情可查看追踪我们 Material 3 工作的 issue;欢迎留下你的反馈。 集成测试改进 2020 年 12 月,我们宣布了使用 integration_test package 进行端到端测试的新方式。这个新 package 取代了 flutter_driver package,成为推荐的集成测试方式,并提供了 Firebase Test Lab 支持以及对 Web 和桌面的支持等新功能。 此后,我们进一步完善了集成测试体验,包括将 integration_test package 打包进 Flutter SDK 本身,使其更容易与你的应用集成。如果你想把现有的 flutter_driver 测试迁移到 integration_test,还有一份新的迁移指南可供参考。 flutter_driver 到 integration_test 迁移指南中的一个示例 现有的若干文档、示例和 codelab 也已更新为 integration_test。要开始使用,请访问 flutter.dev 上的 Testing Flutter apps 页面。如果你的 Flutter 应用还没有使用 integration_test,现在是时候了! Flutter DevTools 本次发布中我们也对 Flutter DevTools 做了一些工作,包括一项面向命令行用户的易用性改进。不再需要用 pub global activate 下载并执行最新版本,现在只需使用 dart devtools,就能获得与你所用 Flutter 版本保持一致的 DevTools 版本。 我们还进行了多项易用性更新,包括改进了 Debugger variables 面板中对大型 list 和 map 的检查支持(感谢 elliette)。 最后,我们即将发布一年一度的 DevTools 调查问卷!请提供你的反馈,帮助我们改善你的开发体验。 这份调查提示将在 2 月中旬的某个时间直接出现在 DevTools 中。谢谢! VSCode 改进 Flutter 的 Visual Studio Code 扩展也得到了多项增强,包括在代码的更多位置显示颜色预览,以及一个能自动更新代码的颜色选择器。 此外,如果你想成为 Dart 和 Flutter VSCode 扩展预发布版的测试者,可以在扩展设置中切换到 prerelease 版本。 你可以在 flutter-announce 邮件列表的这篇文章中阅读本次更新的详细内容。 VS Code extensions v3.32 VS Code extensions v3.34 移除 dev channel 在 Flutter 2.8 发布时,我们宣布正在进行移除 dev channel 的工作,以简化你的选择并减少工程开销。本次发布中,我们完成了这项工作,包括: 更新 Flutter 工具以帮助开发者从 dev channel 迁移 更新 wiki 以反映最新的客户承诺 更新弃用政策 从 DartPad、pre-submit 测试和官网中移除 dev channel 支持 dev channel 现已清理完毕。如有遗漏之处,请告诉我们。 逐步停止支持 iOS 9.3.6 由于使用量下降以及在我们实验室维护目标设备的难度增加,我们将对 iOS 9.3.6 的支持从“Supported”层级降级到“Best Effort”层级。这意味着对 iOS 9.3.6 及 32 位 iOS 设备的支持将仅通过编码实践以及 ad-hoc 和社区测试来维持。 在 2022 年第三季度的稳定版中,我们预计将从 Flutter stable 发布中移除对 32 位 iOS 设备以及 iOS 9 和 10 的支持。这意味着此后基于 stable Flutter SDK 构建的应用将无法在 32 位 iOS 设备上运行,Flutter 支持的最低 iOS 版本将提升至 iOS 11。 破坏性变更 我们一直努力让每次发布的破坏性变更尽量少,本次发布虽然还没完全做到零——但我们会继续努力! Required Kotlin version Deprecated API removed after v2.5 Raw images on Web uses correct origin and colors Scribble Text Input Client 如果你仍在使用这些 API,可以阅读 flutter.dev 上的迁移指南。一如既往,非常感谢社区贡献测试,帮助我们识别这些破坏性变更。 总结 我们 Google Flutter 团队的全体成员想说——谢谢。感谢你成为这个社区的一员,正是这个社区让 Flutter 成为了 Statista 和 SlashData 等分析机构所统计的最流行的跨平台 UI 工具包。Windows 的稳定支持只是一个精彩之年的开端,我们迫不及待想和大家一起构建更多东西! 来自 Flutter 的更多内容 What’s new in Flutter 3.47 Modular by design: Standalone UI Packages and Impeller on Desktop Emma Twersky 2026 年 8 月 12 日 · 12 分钟阅读 What’s new in Flutter 3.44 Empowering developers at Google I/O 2026 Khanh Nguyen 2026 年 5 月 20 日 · 31 分钟阅读