欢迎了解最新的 Flutter 更新!Flutter 3.24 包含了令人兴奋的新功能和增强,可以提升你的应用开发体验。本次发布的亮点包括 Flutter GPU 预览版,它可以直接在 Flutter 中实现高级图形和 3D 场景渲染。Web 应用现在可以嵌入多个 Flutter 视图,增强了应用的多功能性。此外,我们还添加了视频广告变现支持,帮助你最大化收入。

过去几个月,Flutter 社区异常活跃,共有 852 个框架提交和 615 个引擎提交。我们很高兴欢迎 49 名新的贡献者,他们为这个版本的实现做出了贡献。正是你们的奉献和热情推动着 Flutter 不断向前发展。

现在就来了解 Flutter 社区为这个最新版本带来的所有新功能和增强吧!

Flutter 框架

#

新的 Sliver 组件

#

这个版本添加了新的 Sliver 组件,可以组合使用以实现动态应用栏行为:

  • SliverFloatingHeader
  • PinnedHeaderSliver
  • SliverResizingHeader

你可以使用这些新的 Sliver 组件来创建在用户滚动时浮动、保持固定或调整大小的头部。这些新的 Sliver 与现有的 SliverPersistentHeaderSliverAppBar 类似,但 API 更简单,可以组合使用以实现更好的效果。

这些新的 Sliver 还附带了新的示例代码。例如,PinnedHeaderSliver 的 API 文档中有一个示例,重新创建了类似 iOS 设置应用的应用栏效果:

Cupertino 库的更新

#

在这个版本中,我们改进了 CupertinoActionSheet 的保真度。现在在操作表的按钮上滑动手指会提供触觉反馈。按钮的字体大小和粗细现在与原生对应部分匹配。

我们还为 CupertinoButton 添加了新的聚焦属性,你现在可以自定义禁用状态下 CupertinoTextField 的颜色。

Cupertino 库正在进行全面更新,未来的版本中会有更多改进!

TreeView

#

two_dimensional_scrollables package 发布了 TreeView widget,以及几个配套类,用于构建可以在所有方向滚动的高性能树形结构。package 中的示例应用也更新了几个新的使用 TableViewTreeView widgets 的示例。

框架中还添加了 TreeSliver,用于在单维滚动中构建树形结构。TreeViewTreeSliver 的 API 是匹配的,方便你根据用例选择适合的方案。

CarouselView

#

这个版本包含了 Material Design 轮播组件:CarouselView。CarouselView 实现了"未限制"布局:一个可滚动的项目列表,滚动到容器边缘,前导和尾随项目在滚出视图和滚入视图时可以动态改变大小。

更多 widget 功能

#

这个版本包含了一些工作,将核心 widget 逻辑从 Material 库移到 Widgets 库中,以便更通用使用。这包括:

  • Feedback widget,提供了对设备触觉和音频反馈的简单访问,响应轻触、长按等手势。
  • ToggleableStateMixinToggleablePainter,用于构建复选框、开关、单选按钮等切换 widget 的基类。

AnimationStatus 的增强枚举功能

#

在社区成员 @nate-thegrate 的出色贡献中,为 AnimationStatus 添加了增强的枚举功能,包括以下 getter:

  • isDismissed
  • isCompleted
  • isRunning
  • isForwardOrCompleted

其中一些 getter 已经在 Animation 子类中存在,如 AnimationControllerCurvedAnimation。现在所有这些状态 getter 除了在 AnimationStatus 中可用,在 Animation 子类中也可用。最后,为 AnimationController 添加了 toggle 方法来切换动画方向。

SelectionArea 的更新

#

Flutter 的 SelectionArea 现在支持更多与鼠标三击和触摸设备上双击相关的原生手势。默认情况下,SelectionAreaSelectableRegion widgets 使用这些新手势。

三击

  • 三击 + 拖动:以段落块为单位扩展选择。
  • 三击:选择点击位置的段落块。

双击

  • 双击 + 拖动:以单词块为单位扩展选择(在原生 Android/Fuchsia/iOS 和 iOS web 上支持)。
  • 双击:选择点击位置的单词(在原生 Android/Fuchsia/iOS 和 Android/Fuchsia web 上支持)。

引擎

#

Impeller

#

改进性能和保真度

为了即将在稳定版中移除 iOS 上的 Impeller 选择退出选项,团队一直在努力改进 Impeller 的性能和保真度。例如,一系列对文本渲染的改进大大提高了 emoji 滚动的性能,消除了滚动大量 emoji 时的卡顿,这是对 Impeller 文本渲染能力的绝佳压力测试。

此外,通过解决一系列问题,我们在这个版本中也大大改进了 Impeller 的文本渲染保真度。特别是,文本粗细、间距和字距现在都与旧版渲染器的保真度相匹配。

改进前(间距不正确,字体粗细也比预期的轻)

⬆️ ⬇️对比

改进后

改进前:(“vergelijken”中的间距不正确)

改进后

Android 上的 Impeller 预览版本

在这个版本中,我们继续将 Android 上的 Impeller 设定为“预览版本”。由于 Android 14 中的一个 bug 影响了 Impeller 用于平台视图的 API,我们延长了预览期。Android 团队已经修复了这个 bug,但许多已部署的设备在可预见的将来仍将运行未修复的 Android 版本。解决这些问题意味着需要额外的 API 迁移,因此需要额外的稳定版本周期。出于谨慎考虑,为确保 Flutter 应用能在尽可能广泛的设备上工作,我们将推迟到今年晚些时候的稳定版本中将 Impeller 设为默认渲染器。

随着 Impeller 在 Android 上的预览继续进行 3.24 稳定周期,我们请求 Flutter 开发者升级到最新的稳定版本,并在启用 Impeller 时提交发现的任何缺陷问题。这个阶段的反馈对确保 Impeller 在 Android 上的成功至关重要,也让我们能够在今年晚些时候的版本中有信心将其设为默认渲染器。Android 硬件生态系统比 iOS 生态系统更加多样化。因此,关于 Impeller 最有帮助的反馈应该包括发生问题的具体设备和 Android 版本的详细信息。

改进了缩小图像的默认设置

#

在这个版本中,图像的默认 FilterQualityFilterQuality.low 改为了 FilterQuality.medium。当一个大图像比其目标矩形小很多时(这是一种常见场景),FilterQuality.low 会导致图像看起来更 "像素化",渲染速度也比 FilterQuality.medium 慢。展望未来,团队还在探索为各种 FilterQuality 级别提供更合适的名称。

Flutter GPU 预览

#

Flutter 通过 Flutter GPU 引入了渲染能力的重大更新,现已在主渠道上提供。这个低级图形 API 允许开发者使用 Dart 代码和 GLSL 着色器创建自定义渲染器,而无需任何原生平台代码。

Flutter GPU 扩展了 Flutter 的直接渲染能力,实现高级图形和 3D 场景。它需要 Impeller 渲染后端,目前支持 iOS、macOS 和 Android。尽管处于早期预览阶段,但 Flutter GPU 最终旨在支持所有 Flutter 平台。

该 API 允许完全控制渲染通道附件、顶点阶段和向 GPU 上传数据。这种灵活性对于创建从 2D 角色动画到复杂 3D 场景的复杂渲染解决方案至关重要。

开发者可以通过切换到主渠道并将 flutter_gpu package 添加到项目中来开始使用 Flutter GPU。接下来的几个月将看到更多功能和稳定性改进,像 flutter_scene 这样的高级渲染库将简化这些高级功能的使用。

要深入了解 Flutter GPU 并了解如何在项目中利用它,请查看详细的 Flutter GPU 博客文章。无论你是创建游戏还是复杂图形,Flutter 的新 GPU 功能都使其成为你的产品的强大选择。

Web

#

多视图嵌入

#

Flutter Web 应用现在可以利用多视图嵌入,允许开发者同时将内容渲染到多个 HTML 元素中。这个功能被称为“嵌入模式”或“多视图”,为将 Flutter 视图集成到现有 web 应用中提供了灵活性。

在多视图模式下,Flutter web 应用在启动时不会立即渲染。相反,它会等待主机应用使用 addView 方法添加第一个"视图"。主机应用可以动态添加或删除这些视图,Flutter 会相应地调整其 widget。

要启用多视图模式,在 flutter_bootstrap.js 文件中的 initializeEngine 方法中设置 multiViewEnabled: true。然后可以从 JavaScript 管理视图,将它们添加到指定的 HTML 元素中,并根据需要删除它们。每次添加和删除视图都会触发 Flutter 内部的更新,允许动态内容渲染。

这个功能对于将 Flutter 集成到需要多个独立 Flutter 视图的复杂 web 应用中特别有用。它还支持每个视图的自定义初始化数据,实现个性化配置和交互式体验。

要深入了解如何在 Flutter web 应用中实现多视图嵌入,请查看详细文档

变现

#

视频广告变现支持

#

我们推出了一个 互动式媒体广告 (IMA) 插件,以支持 Flutter 移动应用上的插播视频广告变现。新的 IMA 插件在现有的主要支持展示广告格式的 Google 移动广告 (GMA) 插件之上提供了新的广告变现机会。

插播视频视频广告通常在视频内容播放前 (前贴片广告)、期间 (中贴片广告) 或之后(后贴片广告)向用户展示。一些插播视频广告也可以跳过。

Flutter IMA 优势:

  • 无缝地在 Flutter 应用的视频播放器内容中变现。例如,当应用用户点击视频内容上的播放时,你现在可以实现 Flutter IMA 插件,在开始视频内容之前先向用户展示 15 秒的广告。
  • 利用原生 IMA SDK 的相同优势,包括访问优质 Google 广告需求和行业标准合规性(如 IAB VAST — 交互式广告局视频广告服务模板)。

初始发布版本目前支持 Android 和 iOS 平台上的前贴片视频广告。中贴片广告支持将很快推出。我们鼓励开始在 Flutter 应用的视频内容上探索新的 IMA 插件。如果有任何问题或疑虑,请在 GitHub 上告诉我们。

资源: 插件指南示例应用Git 仓库

iOS

#

Swift Package Manager 初步支持

#

目前,Flutter 使用 CocoaPods 来管理原生 iOS 或 macOS 依赖。

Flutter 3.24 增加了对 Swift Package Manager 的早期支持。这带来了几个好处,包括:

  1. 访问 Swift package 生态系统。Flutter 插件将能够利用不断增长的 Swift package 生态系统
  2. 简化 Flutter 安装。Swift Package Manager 与 Xcode 捆绑在一起。将来,开发者无需安装 Ruby 和 CocoaPods 就可以在 Apple 平台上使用 Flutter。

我们鼓励插件作者尝试为插件 添加 Swift Package Manager 支持,并提供使用体验反馈。

如果对 Flutter 对 Swift Package Manager 的支持有反馈,请 提交问题

生态系统

#

Shared Preferences 插件更新

#

我们为 shared_preferences 插件添加了两个新的 API:SharedPreferencesAsyncSharedPreferencesWithCache。最显著的变化是 Android 实现使用 Preferences DataStore 而不是 Shared Preferences。

用户可以使用 SharedPreferencesAsync 直接调用平台获取设备上保存的最新首选项,代价是异步和比使用缓存版本稍慢。这对于可以由其他系统或 isolate 更新的首选项很有用,这会使缓存过时。

SharedPreferencesWithCache 构建在 SharedPreferencesAsync 之上,允许用户同步访问首选项的本地缓存副本。这类似于旧的 API,但现在可以使用不同参数多次实例化。

这些新 API 旨在未来取代当前的 SharedPreferences API。但是,这是生态系统中使用最广泛的插件之一,我们知道生态系统切换到新 API 需要时间。

2024 年欧洲 Flutter 和 Dart Package 生态系统峰会

#

作为 2024 年欧洲 Fluttercon 的一部分,我们举办了第一次面对面的 Flutter 和 Dart Package 生态系统峰会。这是继 2023 年 8 月举行的首次虚拟峰会之后的延续。你可以在 这里 查看讨论会的总结要点。

我们很高兴地宣布,下一次峰会将于 2024 年 9 月 20 日在纽约市的 美国 Fluttercon 举行!如果你是一个 package 作者或贡献者,并且将参加 2024 年美国 Fluttercon,请 注册 以预留你在峰会中的位置。

本峰会汇集了 package 作者和维护者,就以下主题进行了非会议式的讨论:

  • 第 1 场: 原生互操作的过去、现在和未来
  • 第 2 场: 可持续的 package 维护模式
  • 第 3 场: 解决 package 生态系统碎片化

我们相信峰会,特别是作为更广泛的 Flutter 和 Dart 活动的一部分,是社区之间进行开放讨论的宝贵平台,可以揭示关键挑战并集思广益解决方案。我们期待未来与社区合作举办更多此类峰会。

DevTools 和 IDE

#

这个版本包含了对 Flutter DevTools 工具套件的一些令人兴奋的改进。

如果你曾经想知道你的 Flutter 应用是否构建了超出预期的 Widget 数量,DevTools Performance 工具中的一个新功能可以帮助你。使用新的 Rebuild Stats 功能,你可以捕获有关应用中或甚至特定 Flutter 帧中 widget 构建次数的信息。

DevTools Performance 工具跟踪重建统计的屏幕截图

我们为 Network profiler 和 Flutter Deep Links 工具等工具添加了改进和关键 bug 修复,并进行了一些总体改进,以在你从 IDE 中使用 DevTools 时提供更好的体验。说到 IDE,你知道可以直接在 IDE 中使用每个 DevTools 工具吗?

DevTools 屏幕在 VS Code 窗口中打开

DevTools 屏幕在 Android Studio 工具窗口中打开

这个版本包括对 VS Code 中 Flutter 侧边栏的改进,让你更容易访问所需的工具。升级到最新版本的 VS Code 以及 Flutter 和 Dart 扩展以访问改进的侧边栏。

Flutter 侧边栏可自适应并缩放以适应工作区

这个版本还包括对 DevTools 扩展框架 的一些重大改进。现在,当你在调试 Dart 或 Flutter 测试时,甚至当你没有调试任何内容而只是在 IDE 中编写代码时,你都可以使用 DevTools 扩展(由某个 package 依赖提供的工具)。因此,如果你想为这些用户场景之一使用工具(或构建一个!),现在就可以了。

要了解 Flutter 3.24 中包含的所有更新的更多信息,请查看 DevTools 2.35.02.36.02.37.2 的发行说明。

破坏性改动

#

本次发布中的破坏性改动包括对 Navigator 的 pages API (导航页面 API) 的修改、PopScope 中泛型类型的变化 (将 onPopInvoked 方法替换为 onPopInvokedWithResult)、Flutter Web 的默认渲染器的变更,以及一些新的废弃声明。你可以在 破坏性改动页面 上查看完整的迁移指南。

一如既往,我们非常感谢社区提供 测试用例 —— 这些测试用例帮助我们识别这些破坏性改动。要了解更多信息,请查看 Flutter 的破坏性改动处理政策。

结语

#

Flutter 成功的核心是你 - 我们优秀的社区。没有你们无数的贡献和不懈的热情,这个版本就无法实现。我们由衷地感谢你们。

为了详细了解这个版本所取得的具体成果,我们邀请你查看发布说明和变更日志,以获取 Flutter 3.24 中新增内容的完整列表。

现在,Flutter 3.24 以及 Dart 3.5 已经在稳定渠道上可用了。开始使用最新版本的 Flutter 就像运行 flutter upgrade 一样简单。我们迫不及待地想看到你们的创作!