赞
踩
作者 / Chris Sells, Flutter 开发者体验产品经理
欢迎使用 Flutter 2.5,这是一个经历了重大更新的版本。在 Flutter 的版本历史中,此版本涉及的统计数据高居第二: 解决了 4,600 个问题,合并了由 252 个贡献者创建、216 个审核员评估的 3,932 个 PR。在过去一年里,有 1,337 个贡献者创建了多达 21,072 个 PR,其中 15,172 个 PR 被合并。尽管我们之前的文章《无限可能 | Flutter 2 重点更新一览》对新功能进行了重点介绍,但提高您所需功能的质量仍然是我们的第一要务。
如您所见,此版本一如既往地进行了许多重要的性能改进和工具改进,以便您追踪自己的应用存在的性能问题。同时,此版本还提供了许多新功能,包括: 针对 Android 提供全屏支持;提供更多 Material You 支持;更新了文本编辑功能,以支持可切换的键盘快捷键;在 Widget Inspector 中查看 widget 详情;新增了对在 Visual Studio Code 项目中添加依赖项的支持;新增了对从 IntelliJ/Android Studio 内的测试运行中获取覆盖率信息的支持;添加了一款全新的应用模板,为您开发实际的 Flutter 应用提供更好的基础。此版本包含太多激动人心的新变化,下面我们就来详细了解一下。
性能: iOS 着色器预热、异步任务、GC 和消息传递
此版本实现了多项性能改进。首先是一个用于从离线训练运行中连接 Metal 着色器预编译的 PR (#25644),这 (如我们的基准测试所示) 能够将最坏情况下的帧光栅化时长缩短 2/3 秒,并将第 99 个百分位的帧时长缩短一半。我们在减少 iOS 卡顿方面取得了持续性的进展,此 PR 意味着我们在这条道路上又前进了一步。不过,着色器预热只是造成卡顿的原因之一。以前,处理来自网络、文件系统、插件或其他 isolate 的异步事件可能会导致动画中断。这是造成卡顿的另一原因。此版本对 UI isolate 事件循环的调度政策 (#25789) 进行了改进,现在,帧处理的优先级高于其他异步事件的处理,在我们的测试中,并未因此造成卡顿。
△ 因处理异步事件而导致的帧延迟结果前后对比
#25644
https://github.com/flutter/engine/pull/25644
#25789
https://github.com/flutter/engine/pull/25789
造成卡顿的另一个原因是,垃圾回收 (GC) 暂停 UI 线程以回收内存。以前,一些图片的内存只有在响应 Dart VM 执行 GC 时才会被延迟回收。作为早期版本中的权宜之计,Flutter 引擎会提示 Dart VM 可通过 GC 回收图片的内存,这在理论上能使系统更及时地回收内存。遗憾的是,在实践中,这会导致产生过多的重大 GC,而且有时系统仍无法足够快地回收内存,所以也就无法避免内存有限的设备上出现内存不足的情况。在此版本中,系统会积极地回收未使用的图片的内存 (#26219、#82883、#84740),这显著地减少了 GC 数量。
△ 在添加修复程序以积极地回收未使用的大型图片的内存前后的 GC 数量对比
#26219
https://github.com/flutter/engine/pull/26219
#82883
https://github.com/flutter/flutter/pull/82883
#84740
https://github.com/flutter/flutter/pull/84740
例如,在我们的某一项测试中,播放一个 20 秒的 GIF 动画所需的 GC 数量从超过 400 个降低到只需 4 个。GC 大幅减少意味着,涉及图片出现和消失的动画的卡顿次数会减少,耗用的 CPU 和功率也会减少。
Flutter 2.5 中的另一项性能改进是,缩短了在 Dart 和 Objective-C/Swift (iOS) 或 Dart 和 Java/Kotlin (Android) 之间发送消息时发生的延迟。通常,在调整消息通道的过程中,从消息编解码器中移除不必要的副本可大幅缩短延迟时间 (最多可缩短 50%),具体缩短幅度取决于消息大小和设备 (#25988、#26331)。
△ iOS 消息延迟时间前后对比
调整消息通道
https://docs.google.com/document/d/1oNLxJr_ZqjENVhF94-PqxsGPx0qGXx-pRJxXL6LSagc/edit#heading=h.9gabvat7tlxf
#25988
https://github.com/flutter/engine/pull/25988
#26331
https://github.com/flutter/engine/pull/26331
如需详细了解此项改进,您可以参阅由 Aaron Clarke 撰写的博文《在 Flutter 中改进平台渠道性能》:
https://medium.com/flutter/improving-platform-channel-performance-in-flutter-e5b4e5df04af
如果您以 iOS 为目标平台,则最后一项性能更新是: 在此版本中,基于 Apple Silicon M1 Mac 构建的 Flutter 应用会在 ARM iOS 模拟器上以原生方式运行 (#pull/85642)。这意味着 Intel x86_64 指令与 ARM 之间不进行 Rosetta 转换,因而可在 iOS 应用测试期间提升性能,并可让您避免一些细微的 Rosetta 问题 (#74970、#79641)。这是 Flutter 为 Apple Silicon 提供全面支持的道路上迈出的又一步。敬请期待更多更新。
#pull/85642
https://github.com/flutter/flutter/pull/85642
#74970
https://github.com/flutter/flutter/issues/74970#issuecomment-858170914
#79641
https://github.com/flutter/flutter/issues/79641
Dart 2.14: 格式化、语言功能、pub 和开箱即用型 lint
当然,如果没有 Dart 语言和运行时作为构建基础,Flutter 就不能称为 Flutter。Flutter 2.5 同时带来了 Dart 2.14。新版 Dart 含有可使级联更加清晰明了的全新格式设置功能;新增了用于忽略文件的 pub 支持;添加了新的语言功能 (包括传说中的三重移位运算符的回归)。此外,Dart 2.14 最大的亮点之一是,此版本创建了一组标准的 lint,可在新的 Dart 和 Flutter 项目之间共享且开箱即用。
△ 'flutter create' 开箱即有一个 analysis_options.yaml 文件,预先使用了推荐的 Flutter lint
级联
https://dart.dev/guides/language/language-tour#cascade-notation
您不仅可在创建新的 Dart 或 Flutter 项目时获取这些 lint,而且只需几步就能将相同的分析机制添加到现有应用内。如需详细了解这些 lint、全新的语言功能和其他更新,您可以参阅 Dart 2.14 版本公告。
将相同的分析机制添加到现有应用内
https://flutter.cn/docs/release/breaking-changes/flutter-lints-package#migration-guide
框架: Android 全屏、Material You 和文本编辑快捷键
Flutter 2.5 版本包含许多对框架的修复和改进。我们从 Android 着手,修复了一系列与全屏模式相关的问题,获得了上百个点赞。各种全屏模式本身的名称使得这项更新成为我们最喜欢的新功能之一: 向后倾斜、沉浸模式、粘性沉浸模式和边到边。此项更新还添加了一种在其他模式下监听全屏变化情况的方式。例如,对于用户与应用互动后返回系统 UI 的情况,开发者现在可编写代码,以返回到全屏模式或执行其他操作。
△ 全新的 Android 边到边模式:
普通模式 (左)、边到边模式 (中)、采用自定义 SystemUIOverlayStyle 的边到边模式 (右)
修复了一系列与全屏模式相关的问题
https://github.com/flutter/flutter/pull/81303
在此版本中,我们继续构建对全新的 Material You (也称为 "Material v3") 规范的支持,包括对悬浮操作按钮大小和主题的更新 (#86441);以及对全新的 MaterialState.scrolledUnder 状态的支持,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。