新的 Flutter 稳定版加入了 Material 3 更新、iOS 途径优化及其他内容

新年伊始,由 Flutter 3.7 正式版来「打头阵」!咱们与整个 Flutter 社区成员们继续在 Flutter 3.7 中优化了结构,包含创立自界说菜单栏和层叠式菜单、更好的国际化东西支撑、新的调试东西以及其他功用和特性等。

Flutter 3.7 正式发布

新的稳定版里,咱们在继续改善一些特性,例如全局文本挑选、Impeller 烘托速度、DevTools 以及一直以来都在优化的功用。让咱们一起来快速探究 Flutter 3.7 的新特性吧!

增强对 Material 3 的支撑

在 Flutter 3.7 中,以下的 widget 现已进行了 Material 3 的适配:

BadgeBottomAppBarFilledFilled Tonal 按钮、SegmentedButtonCheckboxDividerMenusDropdownMenuDrawerNavigationDrawerProgressIndicatorRadio 按钮、SliderSnackBarTabBarTextFieldsInputDecoratorBanner

你能够直接在运用中的 ThemeData 里设置 useMaterial3 来启用 Material 3。只有在完好的色彩方案下才干展现出 Material 3 最完好的细节,你能够运用新的 Material 主题构建器 生成你的主题装备,也能够经过 Flutter ThemeData 构造中的 colorSchemeSeed (色彩种子) 主动生成一整套的主题:

MaterialApp(
  theme: ThemeData(
     useMaterial3: true,
    colorSchemeSeed: Colors.green,
  ),
  // …
);

若想了解 Flutter 在 Material 3 上的支撑发展,你能够在 GitHub 上检查 flutter #91605 号议题。

你也能够测验 Material 3 示例,其中展现了一切主题的特性。

菜单栏和级联菜单

Flutter 现在能够创立菜单栏和级联菜单了。

macOS 上,你能够运用 PlatformMenuBar widget 来创立菜单栏,你的菜单栏将由 macOS 体系来烘托,而不是运用 Flutter。

此外,关于一切其他的途径,你能够界说一个 Material Design 菜单,它提供了级联菜单栏 (MenuBar),或者运用由 UI 界面元素触发的 (MenuAnchor) 来创立一个级联菜单。这些菜单都是彻底可自界说的,其中的菜单项能够是自界说的 widget,也能够运用新的菜单项 widget: (MenuItemButtonSubmenuButton)。

Flutter 3.7 正式发布

Impeller 预览版在稳定版途径发布

Flutter 团队很高兴能 在稳定版途径上 为大家带来 iOS 途径的 Impeller 烘托引擎 预览。咱们以为 Impeller 的功用现已到达、甚至超越了大部分现有运用上的 Skia 烘托。在图画保真方面,Impeller 也已覆盖了大部分除极点条件以外的运用场景。咱们期望能够在之后的稳定版别中 将 Impeller 作为 iOS 途径的默许烘托引擎,假如你在体会时有任何问题,请继续在 GitHub 上提交 Impeller 的相关反馈。

尽管咱们对 iOS 上 Impeller 满足现有运用的烘托需求有足够的自傲,但仍然有部分 API 需求进行补充。你能够在 Flutter wiki 文档 上看到现在 Impeller 的发展。用户及开发者在运用时可能会注意到 Impeller 与 Skia 之间的烘托细节区别,这些区别可能是 BUG,当你遇届时请记住在 GitHub 上提出 Issue,协助咱们定位并修正它。

Impeller 的发展飞速离不开社区奉献者的支撑。尤其是 ColdPaleLight、guoguo338、JsouLiang 以及 magicianA,他们在此次发布版别的 Impeller 的 291 次提交中有 31 次 (>12%) 是他们提交的。非常感谢他们的协助!

咱们也在 Impeller 的 Vulkan 支撑 (旧设备会回落到 OpenGL) 上有一定的发展,可是 Android Impeller 没有预备好进行公开预览。咱们会在未来的发布中共享更多正在积极进行的 Impeller 开发进程,包含桌面和 Web 途径的支撑。

若你感兴趣,能够重视 GitHub 上的 Impeller 项目看板 来跟进开发发展。

iOS 发布校验

当你在构建一个发布版别的 iOS 运用时,Flutter 会为你提供 项目设置检查清单 来保证你的运用现已预备好发布到 App Store。

现在 flutter build ipa 指令会校验项目的一部分设置,并且在清单中奉告你在发布前进行更改。

Flutter 3.7 正式发布

开发者东西 DevTools 的更新

在本次发布中,开发东西也带来了新的特性和体会优化。DevTools 的内存调试东西现已完成了一轮全面的调整。咱们带来了三个新的选项卡:ProfileTraceDiff,它们包含了从前的一切内存调试功用,也增加了更多利于调试的操作。现在你能够按照类或者内存类型对当时的内存分配进行剖析,能够在运行时剖析哪些代码调用了哪些部分的内存,也能够对比两个不同时刻点的内存快照之间的差异来了解内存运用的细节。

Flutter 3.7 正式发布

以上的这些内存特性现已在 文档 中进行了介绍,若你感兴趣能够前往了解更多细节。

功用页面也有一些值得注意的新功用,该页面现在在顶部新增了 Frame Analysis (帧剖析) 选项卡,它能够提供在 Flutter 中具体追踪大量耗费的某些帧和操作的一些主张。

Flutter 3.7 正式发布

除了以上的新功用,本次更新还有其他的问题修正和优化改善,包含检查器 (Inspector)、网络记录器的 CPU 记录器的问题修正。你能够经过 Flutter DevTools 的发行注纪页面检查 2.17.0 – 2.20.0 版别的 发行注记 了解更多细节。

自界说上下文菜单

重新版别开始,你能够在 Flutter 运用的恣意方位创立自界说的上下文菜单,也能够自界说内置的上下文菜单。

举例来说,你能够在用户选中邮件地址时,为文本框默许的挑选菜单增加「发送邮件」的按钮 (代码地址)。contextMenuBuilder 参数也现已增加到现有包含上下文菜单的 widget 中。你能够在 contextMenuBuilder 中返回任何你想返回的 widget,也包含途径自适应的上下文菜单。

这一新特性也能够用于文本挑选以外的场景。例如,你能够为一个 Image widget 的右键和长按操作增加「保存」按钮 (代码地址)。你也能够运用 ContextMenuController 在运用内的恣意方位展现途径默许或者自界说的上下文菜单。

Flutter 3.7 正式发布

若想检查完好的示例,前往 context_menus 示例代码库房 了解更多。

CupertinoListSection 和 CupertinoListTile widget

Cupertino 系列 widget 迎来了两位新成员: CupertinoListSectionCupertinoListTile,可用于展现 iOS 风格的翻滚列表内容,它们是 Cupertino 版别的 ListViewListTile

Flutter 3.7 正式发布

Flutter 3.7 正式发布

滑动优化

此次版别发布中也包含了众多 滑动相关的问题 修正,包含触控板的交互优化以及在滑动组件中文本挑选时的行为。

值得注意的是,macOS 的运用现在能够经过 新物理滑动特性 来体会与其有更高匹配度的滑动体会。

新的 AnimatedGridSliverAnimatedGrid 能够用于为新增和移除的内容展现动画。

Flutter 3.7 正式发布

最终,咱们 修正了 自 Flutter 迁移至健全的空安全以来的一个问题,该问题影响了一切包含 itemBuilder 参数的滑动 widget (例如 ListView)。在迁移至空安全时,itemBuilder 的类型迁移至了 IndexedWidgetBuilder,即不允许返回 null,而在以前 null 能够用来代表列表现已到了底部等。该参数现已修正为 NullableIndexedWidgetBuilder。感谢 @rrousselGit 发现并修正了这个问题!

国际化东西和文档

Flutter 对国际化的支撑现已焕然一新!咱们对 gen-l10n 进行了重写以支撑下述特性:

  • 描述性的语法过错
  • 嵌套或多个复数、挑选和占位的消息内容

Flutter 3.7 正式发布

更多内容能够了解现已更新的 Flutter 运用里的国际化 文档。

  • Flutter 运用里的国际化文档: flutter.cn/docs/develo…

全局的挑选优化

SelectionArea 现在已支撑键盘操作。你能够经过键盘快捷键 Shift+→ 等快捷键进行挑选。

后台 isolate

现在 途径通道 能够在 恣意 isolate 中进行调用。从前途径通道只能在主 isolate 中进行调用。优化后会让插件和混合开发调用 isolate 和宿主途径代码愈加简单。更多内容能够阅览 编撰途径代码 文档以及 介绍后台 isolate 通道 文章。

文本放大镜

在 Android 和 iOS 上进行文本挑选时会呈现的放大镜现在也会在 Flutter 中呈现了。它现已增加至了一切的文本挑选,可是你也能够经过 magnifierConfiguration 禁用或者自界说。

插件代码迁移至 Swift

Apple 整将它们的代码迁移至 Swift,咱们也期望能为开发者构建 Swift 插件的示例和辅导。quick_actions 现已从 Objective-C 迁移至了 Swift,也能够作为 Swift 插件的最佳实践。假如你对协助 Flutter 迁移榜首方插件至 Swift 感兴趣,请参考 wiki 中的 Swift 迁移部分。

给 iOS 开发者预备的资源

咱们新发布了一系列为 iOS 开发者预备的资源,包含:

  • 给 SwiftUI 开发者的 Flutter 攻略
  • 给 Swift 开发者的 Dart 攻略
  • 给 Swift 开发者的 Flutter 并发开发攻略
  • 将 Flutter 增加到现有的 SwiftUI 运用中
  • 为 Flutter 创立多途径 (针对 Android 和 iOS)

废弃 Bitcode

从 Xcode 14 开始,watchOS 和 tvOS 的运用不再需求 bitcode,并且 App Store 也不再接收带 bitcode 的运用提交。因而,Flutter 也移除了 bitcode 的支撑。

Bitcode 在 Flutter 运用中默许是封闭的,所以这也不该该会影响太多开发者的项目。可是,假如你曾经为你的项目手动启用过 bitcode,请尽快在升级到 Xcode 14 后封闭 bitcode。你能够运用 Xcode 翻开 ios/Runner.xcworkspace 找到 Enable Bitcode 设置为 No,混合开发项目需求在宿主项目中禁用。

Flutter 3.7 正式发布

iOS 途径视图运用 BackdropFilter

咱们为 iOS 原生视图增加了能够烘托高斯模糊的特性,现在嵌套在 BackdropFilter 中的 UiKitView 能够正确的烘托高斯模糊了。

Flutter 3.7 正式发布

你能够检查相应的 规划文档 了解更多。

内存办理

此次发布的版别对内存办理做了一些改善,这些改善的一起作用是减少由 GC 暂停引起的卡顿、减少因为分配速度和后台 GC 线程引起的 CPU 占用,并且下降内存占用。

例如,咱们扩展了现有手动开释某些 dart:ui Dart 方针的本地资源的实践。从前在 Dart VM 垃圾收回 Dart 方针前,本地资源都将被 Flutter 引擎持有。经过对用户运用程序和咱们的 benchmarks 剖析,咱们以为这种策略很多时候无法避免不合适的 GC 和过度运用内存。因而在此次更新中 Flutter 引擎增加了 API ,用于显式开释由 VerticesParagraphImageShader 方针持有的本地资源。

Flutter 3.7 正式发布

在咱们迁移到此 API 的 Flutter 结构的 benchmarks 中,将 90% 的帧构建时刻减少了 30% 以上,最终用户将体会到更流通的动画和更少的卡顿。

此外,Flutter 引擎 不再上报 Dart VM 中的 GPU 图画的大小。如上所述,当这些图画资源不再被需求时已由结构手动开释,假如这时继续按照 GPU 内存大小的 GC 策略上报至 Dart,会导致不必要的堆内存压力并进一步触发无效的 GC。相似的办法相同运用到了 Flutter 引擎中,用于收回 dart:ui 原生方针的 隐式内存占用。

Flutter 3.7 正式发布

在咱们的测试中,此更改省去了 widget 创立 GPU 常驻图画构建帧时的同步 GC 工作。

本次版别发布中,Flutter 引擎在动态更新运用状态至 Dart VM 方面有所进步。具体来说,Flutter 现在会运用 Dart VM 中 RAIL 风格 的 API,让 路由转场时烘托推迟更低,即让堆内存在转场时保持增长而不是进行 GC,避免造成动画的卡顿。现在这项改动不会带来太大的功用优化,但未来咱们会将这项改善拓宽到其他办法上,消除由 GC 带来的卡顿影响。此外,咱们还修正了向 Dart VM 陈述 Flutter 引擎现已闲置的 一处逻辑过错,也减少了 GC 带来的卡顿。最终,在 Flutter 视图不再展现时,也会 通知 Dart VM 进行处理,进一步优化了 Flutter 视图未显现时的内存占用。

抛弃对 macOS 10.11 到 10.13 版别的支撑

咱们在 Flutter 3.3 发布的文章 中提到过,Flutter 将不再支撑 macOS 的 10.11 和 10.12 版别,自上个版别发布以来,经过进一步的 剖析发现,抛弃对 macOS 10.13 的支撑也不会造成太大影响,带来的收效却是能够协助大幅简化代码库。这意味着,运用 Flutter 3.7 以及后续版别构建的桌面端运用程序将不能再在 macOS 10.11、10.12、10.13 版别中运行,Flutter 对 macOS 的最低10点要求版别提升至 macOS Mojave 10.14。

至此,Flutter 构建的 iOS 和 macOS 运用都现已包含了 Metal 的支撑,OpenGL 后端烘托引擎现已从 iOS 和 macOS 嵌入器层被移除,移除后,压缩后的 Flutter 引擎体积下降了大约 100KB。

将 toImageSync 新增至 dart:ui 中

本次版别发布,将 Picture.toImageSyncScene.toImageSync 办法直接加入到了 dart:ui,相似于 Picture.toImage 以及 Scene.toImage. 这样的异步办法,Picture.toImageSync 会直接返回一个 Picture 转 Image 的一个句柄,并在后台异步对 Image 进行光栅化。

当 GPU context 可用时,图画会在 GPU 中常驻,这意味着与 toImage 生成的图画相比它的绘制速度会更快。(toImage 生成的图画也能够完成 GPU 常驻,但现在还未完成)。

新的 toImageSync API 支撑的比如:

  • 快速捕捉一张贵重的栅格化图片,以便跨多帧重复运用。
  • 运用在图片的多路过滤器上
  • 运用在自界说着色器上

一个比如是,Flutter 结构现已运用这个 API 以优化 Android 上的页面切换动画的功用,简直减少了帧光栅化一半的时刻,减少掉帧,在支撑这些刷新率的机器上动画能够到达 90/120fps。

自界说着色器支撑的改善

本次发行版包含了许多关于 Flutter 对自界说着色器片段的优化支撑。Flutter SDK 現已内置了一个着色器编译器,能够将 pubspec.yaml 文件中列出的 GSGL 着色器编译为方针途径的正确的途径特定对应的格式。此外,自界说着色器能够在开发阶段便利的执行 hot reload。自界说着色器现在现已在 iOS 上对 Skia 以及 Impeller 都支撑了。

咱们为社区中共享的样例感到形象深刻,等待能够未来能有更多关于 Flutter 中的自界说着色器的创意。

请参阅 文档网站上的文档 以及 pub.dev 上的 flutter_shaders package 了解更多。

字体资源支撑热重载

在过去,将新的字体资源加入到 pubspec.yaml 文件的时候会需求重新构建运用后才干检查,不像其他资源能够直接热重载收效,现如今,字体清单文件的修正 (包含增加新字体) 后,也能够直接热重载到运用中马上可见了。

减少 iOS 设备上动画作用的卡顿

有两项重要的来自社区成员 luckysmg 的奉献,协助减少了 iOS 设备上动画作用的卡顿。特别是在 iOS 手势交互期间在主线程上增加一个虚拟的 CADisplayLink 以强制设定最大刷新率。此外,键盘动画也经过 CADisplayLink 设定了与 Flutter 引擎里 animator 相同的刷新率。因为新加入了这些改变,用户能够在 120Hz 的 iOS 设备上感受到更一致和流通的动画作用。

结语

还是那句话,假如没有 Flutter 社区中优异、热心奉献者们,Flutter 不会像现在这样优异,在咱们未来继续进行的这段旅程中,咱们期望你能够知道,没有你们,咱们无法做出这样的优异成绩。感恩每一位奉献者!

咱们的发展势头仍旧,请等待未来的更新!

致谢

感谢来自 CFUG 社区的 Alex、Luke、迷鹿、鑫磊 对本文的翻译和审校。