Flutter 3.27 中的新功能
原文 https://medium.com/flutter/whats-new-in-flutter-3-27-28341129570c
简介
让我们深入探讨 Flutter 3.27!此版本充满了改进和功能,专注于优化您的开发体验并提升应用程序的性能。
我们在框架、引擎和生态系统方面都有更新,包括 Impeller 的进展和 Cupertino 小部件的改进。此外,我们还在 DevTools 中引入了令人兴奋的新功能,使管理 Flutter 项目比以往任何时候都更容易。凭借来自 187 位贡献者的超过 1,400 次提交(其中包括 49 位首次贡献者!),Flutter 3.27 是 Flutter 社区难以置信的能量和协作的证明。让我们来探索一下新内容吧!
框架
Cupertino 更新
此版本包括对 CupertinoCheckbox
和 CupertinoRadio
的高保真更新,更新内容涉及尺寸、颜色、描边宽度以及按下时的行为。 CupertinoRadio
、 CupertinoCheckbox
和 CupertinoSwitch
也进行了大规模的可自定义性更新,增加了诸如鼠标光标、语义标签、滑块图像和填充颜色等属性。一些属性,如 CupertinoCheckbox
的非活动颜色已被弃用,而其他属性,如 CupertinoSwitch
的轨道颜色则被重命名。这些更改使这些小部件与其 Material 对应物的功能保持一致。
CupertinoSlidingSegmentedControl
更新了其拇指半径、分隔符高度、内边距、阴影和拇指缩放对齐的保真度。现在还支持禁用单个段,并根据段内容支持比例布局。
感谢社区成员@veloce 的出色贡献,现在 CupertinoNavigationBar
和 CupertinoSliverNavigationBar
的背景在内容滚动到它们下方之前都是透明的。
这允许 sliver 导航栏在其展开状态下与背景具有相同的颜色,但在其折叠状态下具有不同的可自定义颜色(并在滚动时在这两种颜色之间进行插值)。
感谢社区成员 @kerberjg 的出色贡献,你现在可以使用新的 CupertinoButtonSize
枚举和 CupertinoButton
中的新 sizeStyle
属性来应用 iOS 15+ 按钮样式。使用新的 CupertinoButton.tinted
构造函数来创建具有半透明背景的按钮。
CupertinoButton
还有一个新的 onLongPress
处理程序,并允许通过键盘快捷键执行操作。
CupertinoPicker
和 CupertinoDatePicker
现在将滚动到点击的项目。
CupertinoAlertDialog
现在支持轻按滑动手势。
CupertinoActionSheet
进行了一些高保真更新,包括调整所有系统文本大小设置的填充和字体大小,并在滑过按钮时支持触觉反馈。
其他更改包括 CupertinoContextMenu
现在支持在其操作超出屏幕时滚动, CupertinoDatePicker
不再裁剪其列中的长内容,以及 CupertinoMagnifier
通过提供放大比例支持缩放效果。
规范化 Material 主题
在此次发布中, CardTheme
、 DialogTheme
和 TabBarTheme
已被重构以符合 Flutter 的组件主题规范。新增了 CardThemeData
、 DialogThemeData
和 TabBarThemeData
用于定义组件视觉属性默认值的覆盖。未来版本将继续规范化类似这些组件主题,以在 material 库中提供更加一致的主題体验。
CarouselView 的更多功能
此版本引入了 CarouselView.weighted
,在轮播中启用更动态的布局。通过在构造函数中调整 flexWeights
参数,您可以实现多种项目布局。例如,3, 2, 1创建一个多浏览布局,7, 1产生一个英雄布局,而1, 7, 1则生成一个居中英雄布局。这些值表示每个项目在轮播视图中占据的相对权重,并可以根据用户的具体需求进行自定义。
更多内容在 Material 中
此版本包括多个小功能增强和错误修复。一些增强示例:
SegmentedButton
现在有了direction
属性,因此项目可以垂直对齐。
- 为
ButtonStyleButton
类添加了更多与图标相关的属性到 styleFrom 方法(ElevatedButton
、FilledButton
、OutlinedButton
、TextButton
、MenuItemButton
和SubmenuButton
),以允许更多的自定义。
一些错误修复示例:
ButtonStyleButton
类的图标大小和颜色默认值与 Material 3 规范保持一致。- 当导航抽屉打开时,AppBar 的滚动行为现在正确地保持不变,匹配原生 Android 体验。
MenuAnchor
进一步改进,修复了焦点问题和多个DropdownMenu
问题,包括嵌套可滚动元素内的滚动问题和过滤机制行为已得到解决。
混合路由过渡
当之前的路由和新的路由具有不同的页面转换时,ModalRoutes 现在更加灵活。当一个新路由进入屏幕时,有时需要之前的现有路由播放特定的转换,以与新路由的进入转换同步。现在 ModalRoutes
可以互相提供退出转换构建器,使得进入和退出转换始终同步。这允许页面使用 Flutter 的 Navigator 和 Router 实现多个路由转换选项。
文本选择改进
Flutter 的 SelectionArea
现在支持 Shift + Click 手势,以将选择范围移动到点击位置,适用于 Linux、macOS 和 Windows。
你现在也可以通过在 SelectionArea 下使用 clearSelection
方法清除选择,并通过 SelectableRegionState
上的 SelectableRegion
进行操作。通过提供 SelectionArea
一个 GlobalKey
并访问其 SelectionAreaState.selectableRegion
, SelectableRegionState
也变得可访问。
我们还解决了一些与 RenderParagraph 相关的问题,因此在调整窗口大小后,或者在实际文本区域外点击或触摸时, SelectionArea
或 SelectableRegion
下的文本选择仍能按预期工作。
行和列间距
此版本还引入了使用行和列的新便捷功能——间距!这个双重参数将在行和列的子元素之间应用固定数量的像素偏移,减少了之前实现这一效果所需的代码量。
引擎
Impeller 在 Android 上
我们很高兴地分享,Impeller 现已默认成为现代 Android 设备的渲染引擎。虽然 Impeller 在这些设备上自 2023 年 11 月 Flutter 3.16 稳定版发布以来一直处于预览阶段,但在此期间,我们根据用户反馈对性能和保真度进行了大量改进。
在较旧的 Android 设备和不支持 Vulkan 的设备上,仍将使用 Skia 渲染引擎。虽然我们认为 Impeller 的性能和保真度都很高,但用户可以通过向 flutter
命令行工具传递 --no-enable-impeller
或在 AndroidManifest.xml
文件中添加以下内容来选择退出并返回到传统的 Skia 渲染器:
<meta-data android:name=”io.flutter.embedding.android.EnableImpeller” android:value=”false” />
今后,我们将继续改进 Impeller 在 Android 上的性能和保真度。此外,我们打算使 Impeller 的 OpenGL 后端达到生产就绪状态,以去除 Skia 回退。
在预览期间,我们请求 Flutter 开发者升级到最新的稳定版本,并在启用 Impeller 时报告任何发现的不足之处。反馈对于确保 Impeller 在 Android 上取得成功仍然至关重要。Android 硬件生态系统比 iOS 生态系统更加多样化。因此,关于 Impeller 的最有帮助的反馈应包括出现问题的具体设备和 Android 版本的详细信息。
对 iOS 设备的改进
在之前的 Flutter 版本中,用户可能会遇到一个问题,即在 iOS 设备上的应用程序每帧需要等待几毫秒以应对合成器背压。这种背压会在光栅工作负载开始时表现为延迟。在许多情况下,这种延迟会导致错过帧和抖动。这种效果在高帧率设备上尤为明显,因为这些设备的帧时间预算较小。
在此次发布中,开源贡献者 @knopp 添加了一种新的 Metal 渲染表面实现,使得光栅工作负载可以在 UI 工作负载完成后更一致地开始。这意味着用户会发现整体帧时间更加稳定,因为等待 iOS 系统合成器的时间减少了。特别是,Flutter 现在在高帧率设备上能够更一致地达到 120Hz。在我们的基准测试中,我们观察到这一改进在许多场景下大幅减少了平均帧光栅化时间。
此图表显示了在 iPhone 11 设备上运行的大量不同基准测试中,平均帧光栅化时间以毫秒为单位的整体下降。
框架宽色域颜色
Flutter 现在支持使用 DisplayP3 色彩空间中的颜色定义 UI,以充分利用 iOS 设备上的显示屏。它还具有更大的位深度,以支持 sRGB 和 DisplayP3 色彩空间中的更多颜色。这一变化导致一些 Color
方法被弃用;更多信息可以在重大变更通知中找到。
网页
网页改进
此版本为 Flutter Web 带来了多方面的改进,专注于性能、效率和可访问性:
- 在 Safari 和 Firefox 中,现在所有静态图像的解码都是使用
<img>
元素而不是 WebAssembly 编解码器进行的。这消除了与图像解码相关的卡顿并减少了 WASM 内存使用。 - 平台视图已优化,减少了画布覆盖层的数量,提高了渲染效率。
- Flutter 团队开发的所有插件和软件包现在都兼容 WebAssembly。
- 为标题、对话框、密码、iOS 键盘、链接和可滚动元素实现了多个无障碍修复。
- 在 CanvasKit 和 Skwasm 渲染器中修复了多个渲染错误,包括图像滤镜、剪辑和
Paint
对象的内存使用。 - 改进了多视图模式下的拖动滚动。
iOS
Swift 包管理器
Flutter 正在迁移到 Swift Package Manager。这带来了 several benefits:
- 访问 Swift 包生态系统。Flutter 插件将能够利用日益丰富的 Swift 包生态系统!
- 更简单的 Flutter 安装。Swift 包管理器已集成到 Xcode 中。将来,您将无需安装 Ruby 和 CocoaPods 即可使用 Flutter 开发 Apple 平台的应用。
此前,Swift 包管理器支持仅在 Flutter 的 “main” 渠道上可用。我们很高兴地宣布 Swift 包管理器功能现在也在 “beta” 和 “stable” 渠道上可用!目前,默认情况下 Swift 包管理器功能是关闭的,我们将逐步解决相关问题。
鼓励插件作者为您的插件添加对 Swift Package Manager 的支持。许多流行的插件——包括 Firebase、plus 插件等——已经迁移到 Swift Package Manager!
Pub.dev 现在检查插件是否与 Swift Package Manager 兼容。将来,不兼容的软件包将不会获得完整的软件包评分。
如果您对 Flutter 对 Swift Package Manager 的支持有任何反馈,请提交一个问题。
安卓
从边缘到边缘
默认情况下,在运行 Android 15+ 的设备上,您的应用将使用边缘到边缘模式并全屏运行!有关更改的详细信息以及如何选择退出此行为,请参阅指南。
对 Freeform 的支持
Android 自由窗口模式允许用户调整应用程序窗口的大小,并且一直作为开发者选项提供。Flutter 的 SafeArea
和 MediaQuery
已更新为在自由窗口移动到硬件挖孔区域时处理硬件挖孔。
Kotlin 构建脚本支持和声明式插件迁移
开发人员现在可以使用 build.gradle.kts
文件。
Flutter 工具现在支持 Kotlin 构建文件。如果您遇到我们不支持 Kotlin 的地方,请提交一个 bug。Groovy 仍然是受支持的 Gradle 语言。
Flutter 3.27 是最后一个支持 Gradle 传统 apply 脚本方法的版本。请参阅迁移文档。
注意:大多数应用程序需要手动迁移。新创建的应用程序将使用 Kotlin 构建文件。
转向声明式的 Flutter Gradle 插件包含方式有助于 Flutter 迁移到具有更好类型安全性的 Kotlin 构建文件,并使构建代码的单元测试更易于维护。这也是一个更广泛的 effort 的一部分,旨在跨 Android 工具版本带来更多的稳定性。
生态系统
Flutter 和 Dart 包生态系统峰会 USA 2024
作为 2024 年 9 月在美国举行的 Fluttercon 的一部分,我们举办了一场 Flutter 和 Dart 包生态系统峰会。这是继 2024 年 7 月在 Fluttercon 欧洲举办的峰会之后的第二次线下峰会,也是我们在 2023 年 8 月举办的第一次虚拟峰会。请在此查看讨论会的要点总结。
峰会聚集了软件包作者和维护者,以无会议式的会议形式讨论了以下主题:
- 第 1 节 — 添加对 Swift 包管理器的支持
- 第 2 期 —— 本地互操作的过去、现在和未来
- 第 3 节 — 可持续的软件包维护模式
我们期待与社区合作,未来举办更多这样的峰会。
pub.dev 上的软件包下载次数
我们在 pub.dev 上线了下载量统计!
在 pub.dev 上提供更精确的流行度指标,长期以来一直是该网站问题跟踪器中被要求最多的功能。
现在,当你查看软件包页面时,你会看到 30 天下载次数取代了之前的“受欢迎程度评分”。
此外,我们添加了一个交互式的火花线图表,显示每周的下载活动随时间的变化。这个图表帮助开发者和包作者发现包使用情况的趋势。例如,它可以指示新版本发布导致使用量激增,或者一个包正在变得越来越受欢迎或不受欢迎。
每次从 pub.dev 下载软件包时都会注册一次下载。例如,当你运行 flutter pub get
,且该软件包尚未在你的 pub 缓存中时。
显示的下载次数是原始下载次数,反映了来自 CI 系统、软件包分析、人类 pub 客户端用户等的使用情况。
公共工作区
我们正在推出带有 Dart 3.6 的 Pub Workspaces,以支持在一个 monorepo 中开发多个相关包
通过定义一个引用存储库中其他软件包的根 pubspec,在存储库的任何位置运行 pub get 都将为所有软件包生成共享解析。这确保了所有软件包都使用一致的依赖集进行开发。
共享的解析结果也会被分析器获取,现在它只需要为整个工作区跟踪一个分析上下文,这在 IDE 中打开整个仓库时,可能会显著减少内存使用。
从 GitHub 自动发布 Flutter 包
我们扩展了 setup-dart 发布 GitHub Actions 工作流,以允许自动将 Flutter 包发布到 pub.dev,使得以可验证的方式贡献给 Pub 生态系统变得更加容易。
Interactive Media Ads 插件发布
我们推出了一款 Interactive Media Ads (IMA) Flutter 插件,可以轻松将多媒体广告集成到使用 Flutter 构建的 iOS 和 Android 应用中。IMA 插件可以从任何符合 VAST 标准的广告服务器请求广告,并管理应用中的广告播放。广告会在应用程序内容视频播放器顶部的独立视频播放器中播放。目前支持的功能有:
- 客户端用于线性插播视频广告请求的 API
- VAST 和 VMAP
- 单个和分组请求
- 可跳过广告
应用程序内购买 iOS 和 macOS 插件更新
我们已将 StoreKit 2 支持添加到 in_app_purchase_storekit
包中,以迁移到 StoreKit 1 API 之外,这些 API 在 iOS 18 中已被弃用。这使我们能够在未来添加新的 StoreKit 2 功能,例如更好的订阅管理。请留意即将发布的迁移指南,以帮助您过渡到更新的 StoreKit 2 功能。这是一个非破坏性变更,因此您可以随时进行迁移。
开发工具和集成开发环境
Flutter DevTools 更新
此版本包括新功能、整体的稳健性和完善性的改进,以及一些可以从 DevTools 启用的令人兴奋的实验性功能。有关这些功能的更多信息,请参见下面的预览和实验性功能部分。
首先,我们在 Flutter 深链接工具中添加了对验证 iOS 深链接设置的支持。现在你可以验证 Android 和 iOS 的深链接。
在 DevTools 的深度链接工具中验证 iOS 深度链接。
接下来,我们对处理“离线”数据的工作流程进行了一些改进。有时需要导出在 DevTools 中查看的数据以便日后使用或加载到其他工具中。此版本添加了将网络数据导出为 .har
文件的支持,以及在 DevTools 未连接到运行中的应用程序时,加载内存快照到 DevTools 中查看的功能。
此外,如果您曾经在使用 DevTools 调试内存问题时,因为应用程序崩溃(可能是由于您正在调试的 OOM 问题)而丢失了内存工具数据,我们能理解您的沮丧!我们通过允许您在应用程序断开连接后继续查看最近的内存工具数据,修复了这个用户体验痛点。
这些只是此次发布的几个亮点。要了解更多关于 Flutter 3.27 中所有更新的内容,请查看 DevTools 2.38.0、2.39.0 和 2.40.1 的发行说明。
预览和实验性功能尝试
Flutter DevTools — 新的 Flutter 检查器
Flutter Inspector 进行了一些重大更改,以提高可用性并增强您的 UI 调试体验。通过切换“新 Inspector”设置来启用新的 Inspector。
DevTools 中的新 Flutter Inspector。
其中一些更改包括:
- 一个精简的 Widget 树,使查看深层嵌套的 Flutter widget 树变得更加容易。当你在 IDE 内部使用 Flutter Inspector 时,这特别有帮助,因为水平屏幕空间有限。
- 一个选项,用于切换是否在小部件树中包含实现小部件。实现小部件是那些你没有在应用程序代码中包含,而是由 Flutter 框架或其他软件包添加到小部件树中的小部件。
- 所选小部件的详细视图,显示内联布局查看器、小部件和渲染对象属性,以及 Flex 小部件及其子级的弹性布局浏览器。
新的检查器将很快迎来更多改进,但这些更改已经准备好供您尝试!请提交您遇到的任何问题,以便我们在默认启用新的检查器之前修复它们。
Flutter DevTools — 使用 WebAssembly 试用
在 DevTools 设置中启用 WebAssembly 功能以加载 WASM 编译的 DevTools Web 应用。
这应该比默认的 JS 编译版本的 DevTools 提供更好的性能。此功能是实验性的,因此请提交您在使用 WASM 构建时遇到的任何问题。
DevTools 设置为使用 WebAssembly 构建而不是 Javascript 构建。
重大更改和弃用功能
Material Design 3 令牌
最新的 Material Design 3 tokens (v6.1) 已应用于 Flutter Material 库。Material Design tokens 更新仅在浅色模式下更新了 4 种颜色角色的映射,使其在视觉上更具吸引力,同时保持可访问的对比度。我们在测试此更改时没有发现任何中断问题,此更改应用于以下颜色属性:
- 主要容器上的 (Primary10 到 Primary30)
- 次级容器上的 (Secondary10 到 Secondary30)
- 三级容器(Tertiary10 到 Tertiary30)
- 错误容器(Error10 到 Error30)
这会影响使用这些角色作为默认值的小部件。
Chip
的边框颜色( Chip
、 ActionChip
、 ChoiceChip
、 FilterChip
和 InputChip
)已从 ColorScheme.outline
更新为 ColorScheme.outlineVariant
。这改善了芯片和按钮之间的视觉层次结构。
Objective-C iOS 项目
自 2019 年发布的 Flutter 1.9.1 以来,新的 iOS 项目默认使用 Swift。创建新的 Objective-C iOS 项目现已不推荐,并且将在 Flutter 的未来版本中移除 flutter create --ios-language objc
标志。您仍然可以打开 Xcode 项目并添加 Objective-C 文件,包括插件文件。Java 继续通过 flutter create --android-language java
标志支持 Android 应用程序。
深链接默认标志
Flutter 的深度链接标志的默认值已从 false 更改为 true,这意味着深度链接现在默认是选择加入的。如果你使用的是 Flutter 默认的深度链接设置,则无需再手动将标志设置为 true。
但是,如果您使用的是第三方插件来进行深度链接,例如:
此更新将引入一个破坏性更改。在这种情况下,您需要手动将 Flutter 深度链接标志重置为 false。
更多详情,请参阅设计文档:flutter.dev/go/deep-link-flag-migration。
在 IDE 中弃用对旧 SDK 的支持
为了确保我们能够继续提供高质量的开发人员体验,我们将对 IDE 插件支持进行更改。随着 Dart 和 Flutter 的 VS Code 和 IntelliJ 插件的发展,支持旧版 Dart SDK 变得越来越具有挑战性。
从 Dart 3.6 发布开始,我们将不再支持 3.0 版本(2023 年 5 月发布)之前的 Dart SDK 版本。这意味着虽然这些工具可能仍然可以在旧版 SDK 上运行,但我们不会再为这些版本提供官方支持或针对特定问题的修复。
随着 Dart 3.7 的发布(预计在 2025 年第一季度),我们将完全移除对这些旧版 SDK 的支持。插件的未来版本可能与这些版本不兼容。
这对你意味着什么?
- 如果你正在使用较旧的 Dart SDK,我们鼓励你升级到 3.0 或更高版本,以继续获得支持和更新。
- 这一更改影响不到 1%的用户,它将使我们能够专注于为绝大多数开发者提供最佳的体验。
关闭
有关此版本中的所有重大更改,请参阅重大更改页面上的完整迁移指南列表。
一如既往,非常感谢社区贡献测试——这些帮助我们识别破坏性更改。要了解更多,请查看 Flutter 的破坏性更改政策。
结论
非常感谢整个 Flutter 社区让这个版本成为可能!您的贡献、反馈和热情是推动 Flutter 不断前进的动力。我们对 Flutter 的未来感到无比兴奋,并迫不及待地想看到您使用 Flutter 3.27 构建的精彩应用。
要了解所有更改的完整情况,请查看详细发行说明和变更日志。准备好体验最新最棒的功能了吗?只需运行 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