Flutter 3.29 中有什么新内容

Ducafecat
13 min read5 days ago

--

Flutter 3.29 中有什么新内容

介绍

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

视频

https://www.bilibili.com/video/BV1dbAzeTE1y/

https://youtu.be/qg2WDlsm3nw

框架

Cupertino 更新

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

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

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

  • 部分滚动时, CupertinoSliverNavigationBar 会在其展开和折叠状态之间切换。
  • 一个新的 CupertinoNavigationBar.large 构造函数允许静态导航栏显示大标题。
  • 感谢社区贡献者 davidhicks980,Cupertino 弹出窗口现在具有更生动的背景模糊效果,这提高了原生保真度。
  • 新的 CupertinoSheetRoute 显示了一个 iOS 风格的模态视图,可以通过拖动关闭手势移除。
  • 新的 showCupertinoSheet 功能显示带有嵌套导航通用设置的表格。
  • 社区成员 thejitenpatel 改进了 CupertinoAlertDialog 在深色模式下的原生保真度,如下截图所示:

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

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

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

Material

  • FadeForwardsPageTransitionsBuilder 是新的 Material 3 (M3) 页面过渡构建器,旨在匹配 Android 最新的页面过渡行为。在过渡期间,进入的页面从右向左滑入,同时逐渐显现,而离开的页面从右向左滑出,同时逐渐消失。这个新的过渡还解决了之前由 ZoomPageTransitionsBuilder 引起的性能问题。
  • 此版本更新了 CircularProgressIndicatorLinearProgressIndicator 以符合最新的 Material Design 3 规范。要使用更新后的样式,可以将 year2023 属性设置为 false ,或将 ProgressIndicatorThemeData.year2023 设置为 false
  • 此版本还引入了最新的 Material 3 Slider 设计,特色是更新的轨道和手柄形状。 Slider 默认为之前的 Material 3 风格。要启用最新设计,可以将 year2023 设置为 false ,或将 SliderThemeData.year2023 设置为 false

此版本包括针对 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 是否正在积极更改或已确定其选择。

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 上的新检查器页面。

对设备内 widget 选择的更改

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

日志工具改进

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

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

这些只是此次发布的部分亮点。要了解更多关于 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 的破坏性更改政策

结论

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

感谢阅读本文

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

© 猫哥 ducafecat.com

end

--

--

Ducafecat
Ducafecat

No responses yet