Flutter 3.27 中的新功能

介绍

让我们深入了解 Flutter 3.27!此版本充满了增强功能和特性,旨在改善您的开发体验并提高应用的性能。

我们对框架、引擎和生态系统进行了更新,包括 Impeller 的进展和 Cupertino 小部件的改进。此外,我们还在 DevTools 中引入了令人兴奋的新功能,让您比以往更轻松地管理 Flutter 项目。Flutter 3.27 拥有来自 187 位贡献者的 1,400 多次提交(包括49 位首次贡献者!),证明了 Flutter 社区的非凡活力和协作精神。让我们探索新功能!

框架

库比蒂诺更新

CupertinoCheckbox此版本包括对和 的高保真更新CupertinoRadio,包括对大小、颜色、笔触宽度和按下时的行为的更新。 、 和 也进行了大规模的可定制性更新,CupertinoRadio添加CupertinoCheckbox了CupertinoSwitch鼠标光标、语义标签、缩略图和填充颜色等属性。 一些属性(如 的非活动颜色CupertinoCheckbox)已被弃用,而其他属性(如 的轨道颜色CupertinoSwitch)已被重命名。 这些更改使这些小部件的功能与 Material 对应部件相同。

CupertinoSlidingSegmentedControl对其缩略图半径、分隔符高度、填充、阴影和缩略图比例对齐进行了一些保真度更新。它现在还支持禁用单个段,并根据段内容进行比例布局。

感谢社区成员@veloce的杰出贡献,CupertinoNavigationBar和CupertinoSliverNavigationBar的背景现在都是透明的,直到内容在其下方滚动。

这使得细长导航栏在展开状态下具有与背景相同的颜色,但在其折叠状态下具有不同的可自定义颜色(并且能够在滚动时在两种颜色之间进行插值)。

感谢社区成员@kerberjg的出色贡献,您现在可以使用CupertinoButtonSize带有新sizeStyle属性的新枚举来应用 iOS 15+ 按钮样式CupertinoButton。使用新的CupertinoButton.tinted构造函数使按钮具有半透明背景。

CupertinoButton还有一个新的onLongPress处理程序,并允许通过键盘快捷键执行操作。

CupertinoPicker现在将CupertinoDatePicker滚动到所点击的项目。

CupertinoAlertDialog现在支持点击滑动手势。

CupertinoActionSheet看到一些高保真更新,包括调整所有系统文本大小设置中的填充和字体大小以及在滑动按钮时支持触觉反馈。

其他变化包括CupertinoContextMenu现在支持在其操作溢出屏幕时滚动,CupertinoDatePicker不再剪切其列中的长内容,以及CupertinoMagnifier通过提供放大比例来支持缩放效果。

规范化 Material 主题

在此版本中,CardTheme和DialogTheme已重构,TabBarTheme以使其符合 Flutter 的组件主题约定。CardThemeData和被添加来定义组件视觉属性默认值的覆盖。 未来的版本将继续规范化此类组件主题,以便在材料库中获得更一致的主题体验。DialogThemeDataTabBarThemeData

CarouselView 的更多功能

此版本引入了CarouselView.weighted,可在轮播视图中实现更多动态布局。通过调整构造flexWeights函数中的参数,您可以实现各种项目布局。例如,[3, 2, 1] 创建多浏览布局,[7, 1] 生成英雄布局,[1, 7, 1] 生成居中英雄布局。这些值表示每个项目在轮播视图中占据的相对权重,可以根据用户的特定需求进行自定义。

更多材料信息

此版本包含许多小功能增强和错误修复。一些增强示例:

SegmentedButton现在有一个direction属性,因此项目可以垂直对齐。

ButtonStyleButton在类(ElevatedButton、、、、和)的 styleFrom 方法中添加了更多与图标相关的属性,以允许FilledButton更多自定义。OutlinedButtonTextButtonMenuItemButtonSubmenuButton

一些错误修复示例:

类别的图标大小和颜色默认值ButtonStyleButton与 Material 3 规范一致。

当导航抽屉打开时,AppBar 的滚动行为现在能够正确持续,与原生 Android 体验一致。

MenuAnchor通过焦点修复进一步改进,并DropdownMenu解决了几个问题,包括嵌套滚动条中的滚动问题和过滤机制行为。

混合路线转换

当上一个路由和新路由具有不同的页面转换时,ModalRoutesModalRoutes现在更加灵活。当新路由进入屏幕时,有时它们需要上一个现有路由播放某个转换以与新路由的进入转换同步。现在可以相互提供退出转换构建器,以便进入和退出转换始终同步。这允许页面使用 Flutter 的 Navigator 和 Router 在一个页面上拥有多个路由转换选项。

文本选择改进

FlutterSelectionArea现在支持 Shift + Click 手势,可在 Linux、macOS 和 Windows 上将选择范围移动到点击的位置。

您现在还可以通过 SelectionArea下的SelectableRegion方法清除选择。现在也可以通过提供并访问其来访问。clearSelectionSelectableRegionStateSelectableRegionStateSelectionAreaGlobalKeySelectionAreaState.selectableRegion

我们还解决了 RenderParagraph 的一些问题,因此在调整窗口大小后,以及在单击或点击实际文本外部时,选择SelectionArea或下的文本仍可按预期工作。SelectableRegion

行距和列距

此版本还提供了使用行和列的新便利,即间距!此双参数将应用固定数量的像素来使行和列的子元素相互偏移,从而减少以前所需的代码量。

引擎

Android 上的 Impeller

我们很高兴地告诉大家,Impeller 现在是现代 Android 设备上的默认渲染引擎。虽然这些设备上的 Impeller 自 2023 年 11 月 Flutter 3.16 稳定版发布以来一直处于预览状态,但从那时起,我们根据用户反馈对性能和保真度进行了大幅改进。

在较旧的 Android 设备和不支持 Vulkan 的设备上,仍将像以前一样使用 Skia 渲染引擎。虽然我们认为 Impeller 的性能和保真度都是高质量的,但用户可以通过传递--no-enable-impeller到命令行工具或将以下内容放入文件flutter中来选择退出并返回旧版 Skia 渲染器:AndroidManifest.xml

未来我们将继续改进 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中找到。

网页

Web 改进

此版本为 Flutter web 带来了多项改进,重点关注性能、效率和可访问性:

现在,Safari 和 Firefox 中的图像解码使用元素而不是 WebAssembly 编解码器对所有静态图像进行解码。这消除了与图像解码相关的卡顿并减少了 WASM 内存使用量。

平台视图进行了优化,减少画布覆盖的数量,提高了渲染效率。

Flutter 团队开发的所有插件和包现在都与 WebAssembly 兼容。

针对标题、对话框、密码、iOS 键盘、链接和可滚动项实施了多项可访问性修复。

CanvasKit 和 Skwasm 渲染器中修复了许多渲染错误,包括图像过滤器、剪辑和Paint对象的内存使用情况。

改进了多视图模式下的拖动滚动。

iOS

Swift 包管理器

Flutter 正在迁移到 Swift Package Manager。这带来了几个好处:

1.访问 Swift 软件包生态系统。Flutter 插件将能够利用不断增长的Swift 软件包生态系统!

2.更简单的 Flutter 安装。Swift Package Manager 与 Xcode 捆绑在一起。将来,您无需安装 Ruby 和 CocoaPods 即可在 Apple 平台上使用 Flutter。

此前,Swift 包管理器支持仅在 Flutter 的"主"频道上提供。我们很高兴地宣布,Swift 包管理器功能现在也已在"测试版"和"稳定版"频道上提供!目前,Swift 包管理器功能默认处于关闭状态,我们正在解决问题。

鼓励插件作者在插件中添加对 Swift Package Manager的支持。许多流行插件(包括Firebase、plus 插件等)已迁移到 Swift Package Manager!

Pub.dev 现在会检查插件是否与 Swift Package Manager 兼容。将来,不兼容的软件包将不会获得完整的软件包评分。

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

安卓

边到边

在搭载 Android 15 及以上版本的设备上,您的应用默认会使用全屏模式,并以全屏方式运行!有关此更改的详细信息以及如何选择退出此行为,请参阅指南。

支持自由形式

Android Freeform允许用户调整应用窗口大小,并且已作为开发者选项提供。FlutterSafeArea和MediaQuery已更新,可在自由形状窗口移入硬件切口时处理硬件切口。

Kotlin 构建脚本支持和声明式插件迁移

开发人员现在可以使用build.gradle.kts文件。Flutter

工具现在支持 Kotlin 构建文件。如果您遇到我们不支持 Kotlin 的地方,请提交错误。Groovy 仍然是受支持的 Gradle 语言。

Flutter 3.27 是支持Gradle 旧版应用脚本方法的最后一个版本。请参阅迁移文档。

注意:大多数应用需要手动迁移。新创建的应用将使用 kotlin 构建文件。

转向声明式包含 Flutter Gradle 插件有助于 Flutter 迁移到 Kotlin 构建文件,从而提高类型安全性,并更轻松地维护构建代码的单元测试。这也是为 Android 工具版本带来更多稳定性的更广泛努力的一部分。

生态系统

2024 年美国 Flutter 和 Dart 包生态系统峰会

作为 9 月 Fluttercon USA 2024 的一部分,我们举办了 Flutter 和 Dart 软件包生态系统峰会。这是我们第二次面对面的峰会,继 2024 年 7 月的 Fluttercon Europe 峰会和 2023 年 8 月的第一次虚拟峰会之后。请在此处查看讨论环节的总结。

此次峰会将软件包作者和维护人员聚集在一起,以非会议形式讨论以下主题:

第 1 节 --- 添加对 Swift 包管理器的支持

第 2 节 --- Native Interop 的过去、现在和未来

第三节 --- 可持续包装维护模型

我们期待与社区合作,举办更多此类峰会。

pub.dev 上的软件包下载计数

我们在 pub.dev 上推出了下载计数指标!

长期以来,在pub.dev上提供更精确的受欢迎程度指标一直是该网站问题跟踪器中最需要的功能。

现在,当您查看包页面时,您将看到 30 天的下载次数取代了以前的"受欢迎程度分数"。

此外,我们还添加了一个交互式迷你图,显示一段时间内的每周下载活动。此图表可帮助开发人员和软件包作者发现软件包使用趋势。例如,它可以表明新版本已导致使用量激增,或者软件包正在流行或衰落。

每次从 pub.dev 下载包时,都会注册一次下载。例如,当您运行flutter pub get,并且包尚未在您的 pub 缓存中时。

显示的下载计数是原始下载计数,反映了 CI 系统、包分析、人工发布客户端用户等的使用情况。

酒吧工作区

我们正在推出带有 Dart 3.6 的Pub Workspaces,以支持在一个 monorepo 中开发多个相关包

通过定义引用存储库中其他包的根 pubspec,在存储库中的任何位置运行 pub get 将导致所有包共享一个解析。这可确保所有包都使用一组一致的依赖项进行开发。

分析器也会采用共享分辨率,现在只需跟踪整个工作区的单个分析上下文,从而可能在 IDE 中打开整个存储库时显著减少内存使用量。

从 GitHub 自动发布 Flutter 软件包

我们扩展了 setup-dart publish Github Actions 工作流程,还允许将 Flutter 包自动发布到 pub.dev,从而更轻松地以可验证的方式为 Pub 生态系统做出贡献。

推出互动媒体广告插件

我们推出了一款互动媒体广告 (IMA) Flutter 插件,可让您轻松将多媒体广告集成到使用 Flutter 构建的 iOS 和 Android 应用中。IMA 插件可以从任何符合 VAST 标准的广告服务器请求广告,并管理应用中的广告播放。广告在位于应用内容视频播放器顶部的单独视频播放器中播放。当前支持的功能包括:

用于线性插播视频广告请求的客户端 API

虚拟地图

单个请求和 Pod 请求

可跳过的广告

应用内购买 iOS 和 macOS 插件更新

我们已将StoreKit 2支持添加到in_app_purchase_storekit软件包中,以迁移 StoreKit 1 API(iOS 18 中已弃用)。这使我们能够在未来添加新的 StoreKit 2 功能,例如更好的订阅管理。敬请期待即将发布的迁移指南,以帮助您过渡到较新的 StoreKit 2 功能。这是一项非重大更改,因此您可以随时进行迁移。

DevTools 和 IDE

Flutter DevTools 更新

此版本包含新功能、整体稳定性和优化改进,以及一些令人兴奋的新实验性功能,您可以从 DevTools 启用这些功能。有关这些功能的更多信息,请参阅下面的预览和实验性功能部分。

首先,我们在 Flutter Deep Links 工具中添加了对验证 iOS 深层链接设置的支持。现在您可以验证 Android 和 iOS 的深层链接。

DevTools Deep Links 工具中的 iOS 深度链接验证。

接下来,我们对处理"离线"数据的工作流程进行了一些改进。有时需要导出您在 DevTools 中查看的数据以供将来使用或加载到其他工具中。此版本增加了将网络数据导出为文件的支持.har,以及在 DevTools 未连接到正在运行的应用时将内存快照加载到 DevTools 以供查看的支持。

此外,如果您曾经在使用 DevTools 调试内存问题时,因为应用崩溃(可能是由于您尝试调试的 OOM 问题)而丢失了内存工具数据,我们会理解您的沮丧!我们已修复此 UX 痛点,允许您在应用断开连接后继续查看 DevTools 中最新的内存工具数据。

这些只是此版本的一些亮点。要了解有关 Flutter 3.27 中包含的所有更新的更多信息,请查看 DevTools 2.38.0、2.39.0和2.40.1的发行说明。

可供尝试的预览和实验性功能

Flutter DevTools --- 新的 Flutter 检查器

Flutter Inspector 经历了一些重大变化,以提高可用性并增强您的 UI 调试体验。通过切换"新检查器"设置来启用新检查器。

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 令牌(v6.1)已应用于 Flutter Material 库。Material Design 令牌更新了 Light 模式下 4 种颜色角色的映射,使其更具视觉吸引力,同时保留了可访问的对比度。我们在测试此更改时未发现任何中断,这些中断适用于以下颜色属性:

主容器上(主容器 10 到主容器 30)

在辅助容器上(Secondary10 到 Secondary30)

在第三级容器上(第三级 10 至第三级 30)

错误容器(Error10 至 Error30)

这会影响使用这些角色作为默认值的小部件。

Chips(Chip、、、和)ActionChip的边框颜色由 更新为。这改善了筹码和按钮之间的视觉层次。ChoiceChipFilterChipInputChipColorScheme.outlineColorScheme.outlineVariant

Objective-C iOS 项目

自 2019 年 Flutter 1.9.1 发布以来,新的 iOS 项目默认使用 Swift。创建新的 Objective-C iOS 项目现已弃用,并且该flutter create --ios-language objc标志将在未来的 Flutter 版本中被删除。您仍然可以打开 Xcode 项目并添加 Objective-C 文件,包括插件。带有该标志的 Android 应用将继续支持 Java flutter create --android-language java。

深度链接默认标志

Flutter 深度链接标志的默认值已从false更改为true,这意味着深度链接现在默认为可选。如果您使用 Flutter 的默认深度链接设置,则无需再手动将标志设置为true。

但是,如果您使用第三方插件进行深层链接,例如:

firebase 动态链接

uni_link

app_links

本次更新将引入重大变更。在这种情况下,您需要手动将 Flutter 深层链接标志重置为false。

更多细节请参考设计文档:flutter.dev/go/deep-link-flag-migration。

不再支持 IDE 中的旧版 SDK

为了确保我们能够继续提供高质量的开发者体验,我们正在对 IDE 插件支持进行更改。随着 VS Code 和 IntelliJ 的 Dart 和 Flutter 插件的发展,支持旧版 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并开始构建!

相关推荐
鸠摩智首席音效师8 小时前
如何在 MacOS 上安装 Flutter ?
flutter·macos
叫我菜菜就好15 小时前
【Flutter_Web】Flutter编译Web第一篇(插件篇):Flutter_web实现上传TOS上传资源,编写web插件
前端·javascript·flutter·dart
肥肥呀呀呀15 小时前
flutter 多文本,其中文本下划线往下移动
flutter
江上清风山间明月16 小时前
Flutter编译Module was compiled with an incompatible version of Kotlin错误解决
android·flutter·kotlin·version·module·incompatible·compiled
sunly_21 小时前
Flutter:页面中触发点击事件,通过id更新特定视图
前端·javascript·flutter
nicepainkiller3 天前
Flutter 内嵌 unity3d for android
flutter·unity3d
恋猫de小郭3 天前
Flutter Web 正式移除 HTML renderer,只支持 CanvasKit 和 SkWasm
前端·flutter·html
江上清风山间明月3 天前
flutter编译e: Daemon compilation failed: null java.lang.Exception错误解决
java·flutter·exception·daemon·compilation
大G哥3 天前
Flutter如何调用java接口如何导入java包
java·开发语言·flutter