乐趣区

关于flutter:一起看-IO-Flutter-3-更新详解

作者 / Kevin Jamaul Chisholm, Technical Program Manager for Dart and Flutter at Google

又到了 Flutter 稳定版公布工夫,咱们无比骄傲地发表推出 Flutter 3!仅 3 个月前,咱们发表了 Flutter 对 Windows 的反对。当初,咱们再次怀着冲动的情绪发表,继 Windows 之后,Flutter 现已稳固反对 macOS 和 Linux!

咱们总计合并了 5,248 条 PR,感激各位 Flutter 贡献者的辛勤工作!

此版本中激动人心的降级包含: 更新了 Flutter 对 macOS 和 Linux 的反对,性能失去了显著晋升,针对挪动设施和 web 端的更新,以及诸多其余性能!此外,咱们还带来了对于缩小对旧版 Windows 提供反对的音讯,以及几条重大变更。上面让咱们直奔主题吧!

全桌面平台生产就绪

Linux 和 macOS 平台的反对已进入稳固状态,内含下列性能:

级联菜单和 macOS 零碎菜单栏反对

当初您能够应用 PlatformMenuBar widget 在 macOS 上创立平台渲染的菜单栏,反对插入仅限该平台应用的菜单,并管制 macOS 利用菜单中的显示内容。

△ 级联菜单示意

残缺反对全桌面平台多国文本输出

全副三种桌面平台残缺反对多国文本输出,包含应用文本 输入法编辑器 (IME) 的语言,如中文、日文和韩文。同时反对第三方输入法,如搜狗 (Sogou)、谷歌日文输入法 (Google Japanese Input) 等。

全桌面平台无障碍服务

Flutter 反对 Windows、macOS 和 Linux 平台的无障碍服务,包含屏幕文字浏览、无障碍导航和色彩反转等。

macOS 平台默认应用通用二进制文件

在 Flutter 3 中,Flutter macOS 桌面利用会被构建为通用二进制文件,从而原生反对应用 Intel 处理器的 Mac 电脑和搭载 Apple Silicon 的新设施。

不再反对应用 Windows 7/8 进行开发

此版本将倡议的 Windows 开发版本晋升为 Windows 10。尽管咱们不会禁止应用旧版本 (Windows 7、Windows 8、Windows 8.1) 进行开发,但因为 Microsoft 不再反对这些旧版本,咱们仅会针对这些版本提供无限的测试。只管咱们会尽力为旧版本提供反对,但还是建议您降级版本。

留神: 在 Windows 7 和 8 上仍然能够运行 Flutter 利用,此更改只影响咱们举荐应用的开发环境。

挪动端更新

咱们针对挪动端的更新包含:

反对可折叠设施

Flutter 3 反对可折叠挪动设施。通过由 Microsoft 牵头的单干,让大家能够应用新的性能和 widget 在可折叠设施上创立动感、愉悦的体验。

作为单干的一部分,MediaQuery 当初蕴含一个 DisplayFeature 列表,用以形容设施组件状态,包含铰链、折叠状态和屏幕刘海等。此外,DisplayFeatureSubScreen widget 蕴含的子 widget 的地位当初不会与 DisplayFeature 的边界重叠,并且曾经用于框架的默认对话框和弹出窗口,使 Flutter 默认即可动静适应这些元素的地位。

非常感谢 Microsoft 团队。另外咱们还要特地鸣谢 @andreidiaconu 所做出的奉献!

欢送大家尝试 Surface Duo 模拟器示例,其中蕴含了 Flutter Gallery 的一个特地派生版本,以便理解 Flutter 在双屏中的理论运行状况:

反对 iOS 可变刷新率

Flutter 现已在应用 ProMotion 显示屏的 iOS 设施上反对可变刷新率,包含 iPhone 13 Pro 和 iPad Pro。在这些设施上 Flutter 利用的渲染刷新率可达 120 Hz,而之前最高为 60 Hz,这使得滚动等疾速动画的观感体验更加晦涩。请查看 官网文档 理解详情。

简化 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 利用 将其上传至 Apple,或应用 xcrun altool 在命令行中实现上传 (运行 man altool 获取 App Store Connect API 密钥验证阐明)。上传实现后,您的利用即可公布至 TestFlight 或 App Store。在实现利用显示名称、利用图标等初始 Xcode 我的项目设置 后,您在公布利用时就无需再关上 Xcode 了。

Gradle 版本更新

应用 Flutter 工具创立新我的项目时,您或者曾经留神到,生成的文件当初应用了最新版本的 Gradle 和 Android Gradle 插件。对于现有的我的项目而言,您须要手动将 Gradle 版本升级至 7.4,Android Gradle 插件版本升级至 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: 终止对 32 位 iOS 设施的反对。

Web 端更新

咱们针对 web 端的更新包含:

图像解码

在浏览器反对的状况下,Flutter web 当初能够自动检测并应用 ImageDecoder API。到目前为止,大多数基于 Chrome 的浏览器都增加了此 API,如 Chrome、Edge、Opera、Samsung Browser 等。

这个新 API 应用浏览器内置的图像编解码器在主线程之外异步解码图像。这使得图像解码速度进步 2 倍,而且齐全不会阻塞主线程,打消了所有之前由图像引起的卡顿景象。

Web 利用的生命周期

Flutter web 利用的新生命周期 API 晋升了灵活性,可实现从托管 HTML 页面管制 Flutter 利用的疏导程序,并反对应用 Lighthouse 剖析您的利用的性能体现。这实用于许多用例,包含以下常被开发者们提及的场景:

  • 启动画面。
  • 加载指示器。
  • 在 Flutter 利用之前显示的纯 HTML 交互式加载页。

请浏览官网文档 “ 自定义 web 利用初始化 ” 理解详细信息。

工具更新

咱们针对 Flutter 和 Dart 工装的更新内容包含:

Lint package 更新

Lint package 2.0 版现已公布:

  • Flutter
  • Dart

应用 flutter create 生成的 Flutter 3 利用将主动启用 2.0 版 Lint 套件。咱们倡议大家运行 flutter pub upgrade --major-versions flutter_lints,将现有利用、package 和插件迁徙到 2.0 版,以遵循 Flutter 最新、最优的最佳实际。

Lint 2.0 版中新增的大多数正告都带有主动修复性能。因而,当您在利用的 pubspec.yaml 中降级至最新 package 版本后,即可在代码库中运行 dart fix --apply 主动修复大多数 Lint 正告 (某些正告仍需局部手动操作)。对于尚未应用 package:flutter_lints 的利用、package 或插件,倡议开发者依照 迁徙指南 迁徙至最新版本。

性能晋升

感激开源贡献者 knopp,部分重绘曾经在反对此性能的 Android 设施上实现。在咱们的本地测试中,此性能在 Pixel 4XL 设施上将按照 backdrop_filter_perf 基准测试的帧栅格化工夫的平均值、90 百分位值和 99 百分位值缩减了 5 倍。当初,iOS 设施和较新版本的 Android 设施上都已实现在繁多矩形脏区呈现时进行部分重绘。

咱们 进一步晋升 了简略用例中不透明度动画的性能。具体而言,当 Opacity widget 只蕴含单个渲染原语时,通常由 Opacity widget 调用的 saveLayer 办法能够省略。在为此优化构建的基准测试中,此用例下的栅格化工夫晋升了 一个数量级。在今后的版本中,咱们打算为更多场景利用此优化。

在开源贡献者 JsouLiang 的致力下,引擎的光栅和界面线程在 Android 和 iOS 上的运行优先级曾经高于其余线程 (比方 Dart VM 的后盾垃圾回收线程)。在咱们的基准测试中,这使得帧构建均匀工夫提速 约 20%。

在第 3 版公布之前,光栅缓存的准入策略只查看图片中绘制算子的数量 (假如任何具备多个算子的图片都应该进入缓存)。但这会导致引擎耗费内存来缓存渲染速度极快的图片。此版本 引入新的机制,依据所蕴含绘制算子的老本来预计图像渲染的复杂性。在咱们的性能测试中,应用新机制作为栅格缓存准入策略能够 缩小内存用量,而不会升高性能。

感激开源贡献者 ColdPaleLight,他修复了 iOS 上因为 帧调度 bug 而导致大量动画帧失落的问题。感激所有报告此问题并提供掉帧复现视频的每一个人。

Impeller

咱们始终致力于解决 iOS 和其余平台上的晚期卡顿问题。在 Flutter 3 中,您能够在 iOS 上预览一个名为 Impeller 的实验性渲染后端。Impeller 会在引擎构建时预编译一组 较为玲珑、简略的着色器,从而防止在利用运行时编译,而后者是造成 Flutter 卡顿的次要起因。Impeller 尚未作好投产筹备,间隔实现也还有一段距离。目前 Impeller 尚未实现 Flutter 的所有性能个性,但咱们对它在 flutter/gallery 利用中实现的保真度和性能感到称心,并且很快乐地在这里和大家分享开发进度。特地是,在 Gallery 利用的过场动画中,即使最差的帧速度也比之前快大概 20 倍。

Impeller 能够带标记在 iOS 上应用。如果您要试用 Impeller,能够传递 --enable-impeller 标记至 flutter run,或将 Info.plist 文件中的 FLTEnableImpeller 标记为 true。Impeller 的开发会持续在 Flutter 主渠道进行,咱们心愿在将来的版本中提供进一步更新。

Android 上的内联广

应用 google_mobile_ads package 时,您应该能够感触到用户要害交互 (如页面之间的滚动和切换) 的性能有所晋升。在新兴市场广为风行的设施上,这种性能晋升尤其显著。最棒的是,您无需更改任何代码!

在具体实现方面,Flutter 当初是异步组合 Android 视图 (即通常所说的 平台视图)。这意味着 Flutter 的光栅线程无需期待 Android 视图渲染。当初,Flutter 引擎应用它治理的 OpenGL 纹理将视图显示在屏幕上。

更多令人兴奋的更新

咱们针对 Flutter 生态系统的其余更新包含:

Material 3

Flutter 3 反对新一代 Material Design,即 Material Design 3。Flutter 3 提供 Material 3 的可选反对,包含动静色彩、最新色彩零碎和字体等 Material You 性能,还蕴含许多组件的更新,以及在 Android 12 中引入的新触摸波纹设计和拉伸滚动等全新视觉效果。咱们欢送大家通过全新的 “ 将枯燥无味的 Flutter 利用变得生动有趣 ” 的 Codelab 来尝试 Material 3 的性能个性。请参阅 API 文档,具体理解如何选用上述新性能个性,以及哪些组件反对 Material 3。另请关注 Material 3 Umbrella issue 理解最新开发进展。

主题扩大

借助 “ 主题扩大 (Theme extension)”,Flutter 现反对向 Material 库中的 ThemeData 增加任何内容。您当初能够指定 ThemeData.extensions,而无需 (在 Dart 中) 扩大 ThemeData 并从新实现其 copyWithlerp 和其余办法。另外,package 开发者也能够提供 ThemeExtension。请参阅 官网文档 理解详情,并查看 GitHub 上的 相干示例。

广告

咱们晓得对于公布商来说,征求用户批准对个性化广告,以及应答 Apple 的 “ 利用追踪透明度 (App Tracking Transparency, ATT)” 要求十分重要。

为了反对这些需要,Google 提供了 “ 用户音讯平台 (User Messaging Platform, UMP)” SDK,取代了之前的开源 Consent SDK。在行将公布的 Google 挪动广告 SDK (Flutter) 中,咱们会减少对 UMP (用户音讯平台) SDK 的反对,让公布商可能征求用户批准。如需理解详情,请在 pub.dev 上查看 google_mobile_ads package 页面。

重大变更

在继续扩大和改良 Flutter 的过程中,咱们会尽量把重大变更的数量维持在最低限度。Flutter 3 蕴含以下重大变更:

  • 2.10 版之后移除已弃用的 API
  • 页面切换转为应用 ZoomPageTransitionsBuilder
  • Chips 的 useDeleteButtonTooltip 迁徙至 deleteButtonTooltipMessage

如果您正在应用上述 API,请参阅 Flutter.dev 上的 迁徙指南。

总结

依照 Statista 和 SlashData 等剖析机构的统计,Flutter 仍然是最受欢迎的跨平台界面工具包,咱们能放弃这种位置,社区的奉献功不可没,对此,Google Flutter 团队向大家致以由衷敬意。期待与各位社区成员共同努力,持续提供由社区驱动的工具,帮忙大家为用户发明出更多令人愉悦的体验!

退出移动版