前几天,Flutter 2.10 发布了正式版本,该版本距离上个版本的发布还不到两个月时间,但即使在这么短的时间内,Flutter 已经关闭了 1843 个问题,合并了 1525 个 PR。
在2.10版本中,主要的更新内容包括对Flutter的Windows支持的一个大更新,几个显著的性能改进,框架中的图标和颜色的新支持,以及一些工具的改进。此外,我们还获得了一些关于删除开发频道、减少对旧版本iOS的支持的更新,以及一些重大变化。
Flutter Windows 桌面端支持进入稳定版
Flutter 跨平台框架的目的就是致力于打造一个能够构建精美的、可高度定制的、并且可以编译为机器码的跨平台应用解决方案,以充分发挥设备底层硬件的全部图形渲染能力。现在,Flutter 对 Windows 生产版本的正式支持标志着这一愿景的实现。它使 Windows 开发者也能享受到移动开发的相同生产力和功能。
当然,Windows 上的 Flutter 应用程序除了可以使用 iOS 和 Android 上的大部分常用 Flutter 框架外,它们也可以根据需要使用 Win32、COM 和 Windows Runtime APIs等Windows特有的功能。同时,Google还更新了一些常见的 Flutter 插件,以支持 Windows,如相机、file_picker 和 shared_preferences等插件。
如果想要了解更多有关Flutter For Windows的内容,此文深度介绍了Windows上的Flutter架构,允以Flutter包和插件如何支持Windows。
性能改进
此版本的Flutter对社区成员knopp提出的脏区域管理提供支持。如果启用此功能可以在iOS/Metal上为单个脏区域执行重绘。这一变化的好处是在一些基准上减少了90到99个百分点的栅格化时间(所谓栅格化,是指将矢量图形格式表示的图像转换成位图以用于显示器或者打印机输出的过程),并将这些基准上的GPU利用率从超过90%降低到不到10%,如下图所示。
在Flutter 2.8版本中,我们获得了图片的录制过程。在Flutter 2.10,我们已经开始优化构建过程。一个最明显的例子是,我们在构建不透明层的时候基准中的帧光栅所花的时间下降到了之前的三分之一以下。
随着我们对图像构建流程的深入,我们希望能够将这种优化扩展到更多的使用场景。
在profile和release模式下,Dart代码会提前被编译为机器码。不过,这段代码的效率的关键是完整的程序类型流分析,它可以解锁许多编译器优化和积极的树状优化。然而,由于类型流分析必须覆盖整个程序,它可能有点昂贵。这个版本包含了一个更快的类型流分析实现。从的来说,使用新的构建方式后,Flutter应用程序的总体构建时间下降了约10%。
与以往的版本一样,性能增强、减少内存使用和减少延迟是Flutter团队的需要解决的首要任务,我们期待在未来的版本中得到进一步的改进。
iOS更新
除了性能改进之外,我们还新增了特定平台的特性和功能的增强。luckysmg可以让键盘动画是iOS上更加流畅,当需要弹出软键盘时,新的动画效果将会更加流畅,而不需要开发中做任何的事情。
同时,我们还改善了iOS相机插件的稳定性,修复了一些边缘情况下的崩溃。最后,64位iOS架构压缩指针带来了内存使用的降低。
我们知道,64位体系结构能够将指针表示为4字节的数据结构。当有很多对象时,指针本身占用的空间会增加应用程序的总内存使用,特别是遇到复杂的应用程序时,有出现更多的垃圾回收的情况。但是,iOS应用程序不太可能有足够的对象来申请32位地址空间,更不用说更大的64位地址空间了。
Dart 2.15版本提供了压缩指针,它可以减少64位iOS应用程序的内存使用。相关介绍可以查看:Dart 2.15的博客文章来了解细节。
Android更新
当然,这个版本也包含了许多针对Android的改进。我们知道,默认情况下,当我们创建一个新的Flutter应用程序时,Flutter会默认支持最新版本的Android。此外,在这个版本中,我们还自动启用了multidex支持。如果您的应用程序支持Android SDK版本低于21,并且超过64K方法限制,只需在使用flutter build appbundle
或flutter build apk
命令时添加--multidex
属性即可。
最后,我们还修复了社区反馈的Gradle错误。也正是出于这个原因,我们在创建Flutter应用程序时,需要添加最低支持的Android SDK版本,如下所示。
当然,我们继续跟踪社区反馈的问题,并在最新版本中提出修复方案。
Web 更新
这个版本在Web方面也进行了一些改进。例如,在以前的版本中,当在web上滚动到多行TextField的边缘时,它不会正常滚动。这个版本为文本选择引入了边缘滚动,当选择移动到文本字段之外时,字段也可以滚动以查看滚动范围。这种新行为适用于网页和桌面应用。
此外,这个版本的还提供了其他一些改进来提升Web性能。我们一直在寻找一种可以减少Web性能开销的方法。在以前的版本中,我们想把一个原生HTML小部件引入Flutter应用程序,我们需要对HTML小部件进行覆盖重写,然后作为支持web的一部分。如果您的应用程序中有大量的原生HTML小部件,比如链接,这将增加大量的开销。在这个版本中,我们为web创建了一个新的“非绘制平台视图”,从本质上消除了这种开销。我们已经利用了这个优化对链接小部件进行了处理,这意味着如果在你的Web应用程序中有很多链接,将不会有任何显著的开销。
素材
在这个版本我们对整体的配色方案也进行了升级,包括支持渐变颜色。
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
参数,可以将组件切换到新的Material3外观。并且,我们还添加了1028个新的材质图标。
集成测试改进
在2020年12月,我们提供了一个integration_test包进行端到端的测试。这个新包取代了flutter_driver包成为集成测试的推荐方式,并且还提供了新功能,比如Firebase Test Lab支持,以及对web和桌面的支持。
从那时起,我们在集成测试方面做了进一步的改进,包括将integration_test包绑定到Flutter SDK本身,使它更容易与应用程序集成。如果想要将现有的flutter_driver测试迁移到integration_test,我们也提供了迁移指南。
Flutter官方的文档、样例和代码也使用integration_test进行了更新。想要了解更多有关integration_test的内容,可以点击 Testing Flutter apps。
Flutter DevTools
在这个版本,我们也对Flutter DevTools进行了升级和更新,包括一个易于使用的特性,如果我们用命令行使用DevTools,而不是使用pub全局激活来下载和执行最新版本。那么,现在我们现在也可以使用dart devtools
命令来获得最新的版本。
同时,我们还做了一些可用性的更新,包括改进了在Debugger变量窗格中检查大型列表和地图的支持。
最后,诚邀官大开发中提供DevTools的使用体验并反馈给我们,这将有助于我们进行更深层次的改善和优化。
VSCode改进
除此之外,Visual Studio对Flutter的支持也得到了进一步的增强,包括代码中更多地方的颜色预览和颜色选择器,可以方便开发中查看效果。
此外,如果您想成为VSCode的Dart和Flutter预发行版本的测试人员,您可以在扩展设置中切换到预发行版本。
移除dev channel
在 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。
重大改动
我们还努力在每个版本和此版本中减少重大改动,尽管我们还没有完全归零,但我们会继续努力。
- 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 上的迁移指南。一如既往,⾮常感谢社区贡献测试,帮助我们识别这些破坏性改动。