乐趣区

关于flutter:Flutter-37-正式发布

新的 Flutter 稳定版退出了 Material 3 更新、iOS 平台优化及其他内容

新年伊始,由 Flutter 3.7 正式版来「打头阵」!咱们与整个 Flutter 社区成员们持续在 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 示例,其中展现了所有主题的个性。

  • Material 主题构建器: https://m3.material-io.cn/the…
  • 查看 Material 3 的反对进度: https://github.com/flutter/fl…
  • Material 3 示例: https://flutter-experimental-…

菜单栏和级联菜单

Flutter 当初能够创立菜单栏和级联菜单了。

在 macOS 上,你能够应用 PlatformMenuBar widget 来创立菜单栏,你的菜单栏将由 macOS 零碎来渲染,而不是应用 Flutter。

此外,对于所有其余的平台,你能够定义一个 Material Design 菜单,它提供了级联菜单栏 (MenuBar),或者应用由 UI 界面元素触发的 (MenuAnchor) 来创立一个级联菜单。这些菜单都是齐全可自定义的,其中的菜单项能够是自定义的 widget,也能够应用新的菜单项 widget: (MenuItemButtonSubmenuButton)。

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 我的项目看板来跟进开发进度。

  • Impeller 的反对进度: https://github.com/flutter/flutter/wiki/Impeller#status
  • Impeller 我的项目看板: https://github.com/orgs/flutter/projects/21

iOS 公布校验

当你在构建一个公布版本的 iOS 利用时,Flutter 会为你提供 我的项目设置查看清单 来确保你的利用曾经筹备好公布到 App Store。

当初 flutter build ipa 命令会校验我的项目的一部分设置,并且在清单中告知你在公布前进行更改。

开发者工具 DevTools 的更新

在本次公布中,开发工具也带来了新的个性和体验优化。DevTools 的内存调试工具曾经实现了一轮全面的调整。咱们带来了三个新的选项卡:ProfileTraceDiff,它们蕴含了先前的所有内存调试性能,也增加了更多利于调试的操作。当初你能够依照类或者内存类型对以后的内存调配进行剖析,能够在运行时剖析哪些代码调用了哪些局部的内存,也能够比照两个不同工夫点的内存快照之间的差别来理解内存应用的细节。

以上的这些内存个性曾经在 文档 中进行了介绍,若你感兴趣能够返回理解更多细节。

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

除了以上的新性能,本次更新还有其余的问题修复和优化改良,包含查看器 (Inspector)、网络记录器的 CPU 记录器的问题修复。你能够通过 Flutter DevTools 的发行注纪页面查看 2.17.0 – 2.20.0 版本的发行注记理解更多细节。

  • Flutter DevTools 的发行注纪索引页: https://flutter.cn/docs/devel…

自定义上下文菜单

从新版本开始,你能够在 Flutter 利用的任意地位创立自定义的上下文菜单,也能够自定义内置的上下文菜单。

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

这一新个性也能够用于文本抉择以外的场景。例如,你能够为一个 Image widget 的右键和长按操作增加「保留」按钮 (代码地址)。你也能够应用 ContextMenuController 在利用内的任意地位展现平台默认或者自定义的上下文菜单。

若想查看残缺的示例,返回 context_menus 示例代码仓库 理解更多。

  • 为文本框默认的抉择菜单增加发送邮件按钮代码地址: https://bit.ly/email_button_page
  • 为 Image widget 增加右键和长按保留按钮代码地址: https://bit.ly/image_page
  • Flutter 自定义上下文菜单残缺示例代码: https://bit.ly/context_menus

CupertinoListSection 和 CupertinoListTile widget

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

滑动优化

此次版本公布中也蕴含了泛滥 滑动相干的问题 修复,包含触控板的交互优化以及在滑动组件中文本抉择时的行为。

值得注意的是,macOS 的利用当初能够通过 新物理滑动个性 来体验与其有更高匹配度的滑动体验。

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

最初,咱们 修复了 自 Flutter 迁徙至健全的空平安以来的一个问题,该问题影响了所有蕴含 itemBuilder 参数的滑动 widget (例如 ListView)。在迁徙至空平安时,itemBuilder 的类型迁徙至了 IndexedWidgetBuilder,即不容许返回 null,而在以前 null 能够用来代表列表曾经到了底部等。该参数现已批改为 NullableIndexedWidgetBuilder。感激 @rrousselGit 发现并修复了这个问题!

国际化工具和文档

Flutter 对国际化的反对曾经面目一新!咱们对 gen-l10n 进行了重写以反对下述个性:

  • 描述性的语法错误
  • 嵌套或多个复数、抉择和占位的音讯内容

更多内容能够理解曾经更新的 Flutter 利用里的国际化 文档。

  • Flutter 利用里的国际化文档: https://flutter.cn/docs/devel…

全局的抉择优化

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,混合开发我的项目须要在宿主我的项目中禁用。

iOS 平台视图利用 BackdropFilter

咱们为 iOS 原生视图增加了能够渲染高斯含糊的个性,当初嵌套在 BackdropFilter 中的 UiKitView 能够正确的渲染高斯含糊了。

你能够查看相应的 设计文档 理解更多。

  • 设计文档: https://files.flutter-io.cn/f…

内存治理

此次公布的版本对内存治理做了一些改良,这些改良的独特作用是缩小由 GC 暂停引起的卡顿、缩小因为调配速度和后盾 GC 线程引起的 CPU 占用,并且升高内存占用。

例如,咱们扩大了现有手动开释某些 dart:ui Dart 对象的本地资源的实际。先前在 Dart VM 垃圾回收 Dart 对象前,本地资源都将被 Flutter 引擎持有。通过对用户应用程序和咱们的 benchmarks 剖析,咱们认为这种策略很多时候无奈防止不适合的 GC 和适度应用内存。因而在此次更新中 Flutter 引擎增加了 API,用于显式开释由 VerticesParagraphImageShader 对象持有的本地资源。

在咱们迁徙到此 API 的 Flutter 框架的 benchmarks 中,将 90% 的帧构建工夫缩小了 30% 以上,最终用户将体验到更晦涩的动画和更少的卡顿。

此外,Flutter 引擎 不再上报 Dart VM 中的 GPU 图像的大小。如上所述,当这些图像资源不再被须要时已由框架手动开释,如果这时持续依照 GPU 内存大小的 GC 策略上报至 Dart,会导致不必要的堆内存压力并进一步触发有效的 GC。相似的办法同样利用到了 Flutter 引擎中,用于回收 dart:ui 原生对象的 隐式内存占用。

在咱们的测试中,此更改省去了 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、迷鹿、鑫磊 对本文的翻译和审校。

退出移动版