深入探索 Flutter 3.29!此版本改进了开发体验并提升了性能,对 Impeller、Cupertino、DevTools 等进行了更新。在本次发布周期中,有 104 位独特作者贡献了代码,Flutter 3.29 展现了社区的 dedication。让我们看看有哪些新内容!

Flutter 3.29 中有什么新内容

Flutter 3.29

介绍

深入探索 Flutter 3.29!此版本改进了开发体验并提升了性能,对 Impeller、Cupertino、DevTools 等进行了更新。在本次发布周期中,有 104 位独特作者贡献了代码,Flutter 3.29 展现了社区的 dedication。让我们看看有哪些新内容!

框架

Cupertino 更新

CupertinoNavigationBarCupertinoSliverNavigationBar 现在接受一个底部widget,通常是一个搜索字段或分段控件。

在一个 CupertinoSliverNavigationBar 中,可以通过 bottomMode 属性配置底部widget,以自动调整大小直至隐藏,或在导航栏滚动时始终显示。

img

img

其他对导航栏的更改包括:

  • 部分滚动时, CupertinoSliverNavigationBar 会在其展开和折叠状态之间切换。
  • 一个新的 CupertinoNavigationBar.large 构造函数允许静态导航栏显示大标题。
  • 感谢社区贡献者 davidhicks980,Cupertino 弹出窗口现在具有更生动的背景模糊效果,这提高了原生保真度。

img

  • 新的 CupertinoSheetRoute 显示了一个 iOS 风格的模态视图,可以通过拖动关闭手势移除。
  • 新的 showCupertinoSheet 功能显示带有嵌套导航通用设置的表格。

img

  • 社区成员 thejitenpatel 改进了 CupertinoAlertDialog 在深色模式下的原生保真度,如下截图所示:

img

改进前 — 左边是原生视图,右边是 Flutter 视图

img

改进后 — 左边是原生视图,右边是 Flutter 视图

  • 当反转时,Flutter 的文本选择手柄在 iOS 上交换它们的顺序,且文本选择放大镜的边框颜色现在与当前主题匹配。

img

Material

  • FadeForwardsPageTransitionsBuilder 是新的 Material 3 (M3) 页面过渡构建器,旨在匹配 Android 最新的页面过渡行为。在过渡期间,进入的页面从右向左滑入,同时逐渐显现,而离开的页面从右向左滑出,同时逐渐消失。这个新的过渡还解决了之前由 ZoomPageTransitionsBuilder 引起的性能问题。

img

  • 此版本更新了 CircularProgressIndicatorLinearProgressIndicator 以符合最新的 Material Design 3 规范。要使用更新后的样式,可以将 year2023 属性设置为 false ,或将 ProgressIndicatorThemeData.year2023 设置为 false

img

img

  • 此版本还引入了最新的 Material 3 Slider 设计,特色是更新的轨道和手柄形状。 Slider 默认为之前的 Material 3 风格。要启用最新设计,可以将 year2023 设置为 false ,或将 SliderThemeData.year2023 设置为 false

img

此版本包括针对 Material 库的多个错误修复和功能增强。值得注意的修复包括:

  • 键盘导航现在正确触发了 DropdownMenu.onSelected 回调。
  • 改进了 TabBar 弹性标签动画。
  • 改进了 RangeSlider 拇指对齐,包括分隔、拇指间距和圆角。

除了错误修复之外,此版本还增强了几个 Material 组件的可定制性。添加了 mouseCursor 属性到 ChipTooltipReorderableListView ,允许在悬停时自定义鼠标指针。

文本选择

Flutter 现在为您提供有关 SelectionAreaSelectableRegion 下选择的更多信息,带有 SelectionListenerSelectionListenerNotifier 。通过 SelectionListenerNotifier 获取的 SelectionDetails 对象,为您提供选择的开始和结束偏移量(相对于包装的子树),并指示是否存在选择以及它是否已折叠。对于您想要监听的widget或可选择的子树,使用 SelectionListener widget进行包装。

Flutter 还通过 SelectableRegionSelectionStatusScope 继承的 widget 向你提供有关 SelectionAreaSelectableRegion 状态的信息。你可以使用 SelectableRegionSelectionStatusScope.maybeOf(context) 并检查 SelectableRegionSelectionStatus 来查看父级 SelectionAreaSelectableRegion 是否正在积极更改或已确定其选择。

img

Accessibility 无障碍

此版本改进了多个 Material widget的可访问性:

  • 当启用了屏幕阅读器时,表单widget仅宣布它遇到的第一个错误。
  • 屏幕阅读器现在会正确宣布下拉菜单的标签。

web 网页

最初于 2024 年 5 月发布时,Flutter 的 WebAssembly (wasm) 在网页上的支持要求你使用特殊的 HTTP 响应头来托管你的 Flutter 应用程序。现在这个要求已经放宽。虽然更新这些头部允许使用多线程运行基于 wasm 构建的 Flutter 网页应用,但使用默认头部现在也允许应用程序以 wasm 运行,只不过限制为单线程。

我们已经在 WebGL 后端修复了几个与图像相关的问题,但最重要的是:

Engine 引擎

Impeller Vulkan 稳定性

感谢对 3.27 测试版和稳定版的反馈和错误报告,Vulkan 后端进行了一系列正确性和性能改进,包括:

  • 修复了多个用户在较旧的 Vulkan 兼容设备上报告的可重现闪烁和视觉抖动问题。
  • 禁用 Android 硬件缓冲区交换链。此功能已被放置在功能标志后面,直到确定它能在 Android 设备上正确工作为止。
  • 大量黑屏和崩溃报告是由于在 MediaTek/PowerVR soc 上使用 Vulkan 造成的,这些功能已被禁用。这些设备现在只使用 Impeller OpenGLES(见下文)。
  • Android 模拟器已更新为使用 Impeller GLES 后端。

Impeller OpenGLES

在 3.29 中,没有功能正常的 Vulkan 驱动的 Android 设备将回退到在 OpenGLES 上运行 Impeller,而不是使用 Skia。此行为默认启用,无需进行配置。这使得 Android 上的 Impeller 支持覆盖了 Flutter 支持的所有 Android 设备的 100%。

Impeller 在 iOS 上

Skia 支持已从 iOS 后端移除,且 FLTEnableImpeller 退出标志不再生效。随着我们开始从 iOS 构建中移除 Skia 组件,预计未来版本将进一步减少二进制大小。

新功能

此版本包含多个利用 Impeller 后端的新功能。

背景滤镜优化

显示多个背景区滤镜的应用程序现在可以使用新的widget BackdropGroup 和新的 BackdropFilter.grouped 构造函数。这些可以在 Skia 后端的基础上进一步提高多个模糊效果的性能。例如,可以查看 basic.dart 源代码。

ImageFilter.shader

一个新的 ImageFilter 构造函数允许将自定义着色器应用于任何子部件。这提供了与 package:flutter_shaders 中的 AnimatedSampler widget类似的功能,不同之处在于它还支持背景滤镜。有关示例,请参阅 painting.dart 源代码。

Dart 线程更改在 Android/iOS 上

之前,Flutter 在与平台主线程不同的线程(UI 线程)上执行 Dart 代码。这在理论上允许更高的吞吐量,前提是平台和 UI 线程都被占用,但代价是大多数平台互操作需要序列化和异步消息传递。这种架构还对文本输入、无障碍功能、插件等产生了连锁反应。

从 3.29 开始,Flutter 在 Android 和 iOS 上在应用程序的主线程上执行 Dart 代码,不再有单独的 UI 线程。这是移动平台上一系列改进平台互操作性的更改中的第一部分,因为它允许在平台之间进行同步调用,而无需序列化和消息传递的开销。

DevTools 和 IDEs

新的 DevTools 检查器

新的 DevTools 检查器默认为所有用户启用。新的检查器具有简化的widget树、新的widget属性视图,并提供在热重载和导航事件时自动更新的选项。更多详情,请访问 docs.flutter.dev 上的新检查器页面。

img

对设备内 widget 选择的更改

在从 DevTools 检查器启用widget选择模式后,设备上的任何选择都被视为widget选择,直到您退出widget选择模式。以前,在初始widget选择之后,您需要点击设备上的“选择widget”按钮以选择另一个widget。现在,有一个设备上的按钮可以用来快速退出widget选择模式。

img

日志工具改进

DevTools 中的 Logging 工具已以下方式进行改进:

  • 日志包括并显示更多元数据,例如日志严重性、类别、区域和 isolate。
  • 添加了按日志严重性级别过滤的支持。
  • 性能和初始加载时间有显著提升。

img

这些只是此次发布的部分亮点。要了解更多关于 Flutter 3.29 中的所有更新,请查看 DevTools 2.41.0 和 2.42.2 的发行说明。

重大更改和弃用

停止支持软件包

我们计划在 2025 年 4 月 30 日停止对以下软件包的支持:

我们鼓励社区中任何感兴趣的成员协调建立和维护分叉。链接到问题的地址如上所述,用于讨论和协调。

移除基于脚本的 Flutter Gradle 插件应用

移除自 3.19 版本起已弃用的基于脚本的 Flutter Gradle 插件应用。这支持将 Flutter Gradle 插件从 Groovy 转换为 Kotlin,并逐步迁移到使用 AGP 的公共 API。这项工作预计会减少在发布新 AGP 版本时的故障频率,并减少基于构建的回归。

在 3.16 之前创建但尚未迁移的项目可能会受到影响。如果在构建项目时,flutter 工具记录了警告:“您正在命令式地应用 Flutter 的主 Gradle 插件”,则表示您受到影响,需要根据 docs.flutter.dev 上的“已弃用的命令式应用 Flutter 的 Gradle 插件”进行迁移。

移除网页 HTML 渲染器

这是第一个从 Flutter Web 中移除 HTML 渲染器的版本。如需更多信息,请访问 Flutter Web 中弃用和移除 HTML 渲染器的意图以及 Issue 145584: Intent to deprecate and remove the HTML renderer in Flutter web

Web 图像处理

此版本还让您对网页上图像的显示方式拥有更多控制权。在之前的测试版发布(3.28)中,当发生 CORS 错误时,Image widget会自动使用 <img> 元素从 URL 显示图像。这可能会导致行为不一致。现在, webHtmlElementStrategy 标志让您选择何时使用 <img> 元素。虽然此回退默认是禁用的,但根据应用程序的需求,您仍然可以启用回退或甚至优先使用 <img> 元素。

Material 正规化

作为我们在 Material 中持续的主题规范化项目的一部分,此版本弃用 ThemeData.dialogBackgroundColor 而支持 DialogThemeData.backgroundColor 。您可以使用 dart fix 命令来迁移受影响的代码。

同样在 Material 中, ButtonStyleButton iconAlignment 属性在被添加到 ButtonStyle 和相关的 styleFrom 方法后被弃用。

有关此版本中的所有重大更改,请参阅网站上的“重大更改”页面的完整迁移指南列表。

一如既往,非常感谢社区贡献测试——这些帮助我们识别破坏性更改。要了解更多,请查看 Flutter 的破坏性更改政策

结论

img

感谢 Flutter 社区让这个版本成为可能!我们对未来发展感到兴奋,迫不及待想看到您的应用程序。查看发行说明和变更日志,然后运行 flutter upgrade 并开始构建!

感谢阅读本文

如果有什么建议,请在评论中让我知道。我很乐意改进。


猫哥 APP

flutter 学习路径


© 猫哥 ducafecat.com

end