Flutter 3.29 中有什么新内容
介绍
深入探索 Flutter 3.29!此版本改进了开发体验并提升了性能,对 Impeller、Cupertino、DevTools 等进行了更新。在本次发布周期中,有 104 位独特作者贡献了代码,Flutter 3.29 展现了社区的 dedication。让我们看看有哪些新内容!
框架
Cupertino 更新
CupertinoNavigationBar
和 CupertinoSliverNavigationBar
现在接受一个底部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
引起的性能问题。
- 此版本更新了
CircularProgressIndicator
和LinearProgressIndicator
以符合最新的 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
属性到 Chip
、 Tooltip
和 ReorderableListView
,允许在悬停时自定义鼠标指针。
文本选择
Flutter 现在为您提供有关 SelectionArea
或 SelectableRegion
下选择的更多信息,带有 SelectionListener 和 SelectionListenerNotifier
。通过 SelectionListenerNotifier
获取的 SelectionDetails 对象,为您提供选择的开始和结束偏移量(相对于包装的子树),并指示是否存在选择以及它是否已折叠。对于您想要监听的widget或可选择的子树,使用 SelectionListener
widget进行包装。
Flutter 还通过 SelectableRegionSelectionStatusScope 继承的 widget 向你提供有关 SelectionArea
或 SelectableRegion
状态的信息。你可以使用 SelectableRegionSelectionStatusScope.maybeOf(context) 并检查 SelectableRegionSelectionStatus 来查看父级 SelectionArea
或 SelectableRegion
是否正在积极更改或已确定其选择。
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 日停止对以下软件包的支持:
- ios_platform_images;参见 ios_platform_images 计划停止使用 #162961
- css_colors;参见 css_colors 计划停止使用 #162962
- palette_generator;参见 palette_generator 计划停止使用 #162963
- flutter_image;参见 flutter_image 停用 #162964
- flutter_adaptive_scaffold;参见 flutter_adaptive_scaffold 计划停止维护 #162965
- flutter_markdown;参见计划停止维护的 flutter_markdown #162966
我们鼓励社区中任何感兴趣的成员协调建立和维护分叉。链接到问题的地址如上所述,用于讨论和协调。
移除基于脚本的 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
并开始构建!
感谢阅读本文
如果有什么建议,请在评论中让我知道。我很乐意改进。
猫哥 APP
flutter 学习路径
- Flutter 优秀插件推荐
- Flutter 基础篇1 - Dart 语言学习
- Flutter 基础篇2 - 快速上手
- Flutter 实战1 - Getx Woo 电商APP
- Flutter 实战2 - 上架指南 Apple Store、Google Play
- Flutter 基础篇3 - 仿微信朋友圈
- Flutter 实战3 - 腾讯即时通讯 第一篇
- Flutter 实战4 - 腾讯即时通讯 第二篇
© 猫哥 ducafecat.com
end