让我们一起来深入了解 Flutter 3.27!这个版本带来了许多改进和新功能,专注于提升你的开发体验并增强你应用的性能。
我们在框架、引擎和生态系统方面都有更新内容,包括在Impeller方面的进展和对Cupertino部件的改进。此外,我们还将在DevTools中推出令人兴奋的新功能,让Flutter项目的管理变得更加轻松。Flutter 3.27拥有来自187位贡献者(其中包括49位首次贡献的新成员)的超过1,400次提交,充分体现了Flutter社区的强大活力和协作精神。接下来就让我们一起来看看有哪些新变化吧!
框架 库比蒂诺的更新此版本包括对 CupertinoCheckbox
和 CupertinoRadio
的高质量更新,更新了尺寸、颜色、描边宽度以及点击行为。CupertinoRadio
、CupertinoCheckbox
和 CupertinoSwitch
还对自定义选项进行了大量更新,添加了鼠标指针、语义标签、按钮图标和填充颜色等属性。一些属性,例如 CupertinoCheckbox
的非激活颜色,已弃用,而另一些属性,如 CupertinoSwitch
的轨道颜色,则被重命名。这些更改使这些组件的功能与它们的 Material 对应组件保持一致。
CupertinoSlidingSegmentedControl
在拇指半径、分隔线高度、内边距、阴影和拇指缩放对齐等方面进行了某些方面的改进。它现在还能够禁用单个分段,并且可以根据分段内容进行比例布局。
由于社区成员@veloce的杰出贡献,CupertinoNavigationBar
和 CupertinoSliverNavigationBar
的背景现在在内容滚动到它们下方前都是透明的。
这使得细条导航栏在展开时与背景颜色相同,但在折叠时可以设置为不同的颜色(并且在滚动时在这两种颜色之间平滑过渡)。
感谢社区成员@kerberjg的杰出贡献,现在你可以使用新的sizeStyle
属性来应用iOS 15+的按钮风格,该属性位于新的CupertinoButtonSize
枚举和CupertinoButton
中。你可以使用新的CupertinoButton.tinted
构造函数来创建带有半透明背景的按钮。
CupertinoButton
增加了长按事件处理器,并可以通过键盘快捷键执行操作。
CupertinoPicker
和 CupertinoDatePicker
现在点击会滚动到相应的项。
CupertinoAlertDialog
现支持点击滑动操作。
CupertinoActionSheet
在更新方面有一些高保真改进,包括调整了内边距和字体大小,以适应所有系统文本大小设置,并提供了在滑动经过按钮时的触感反馈。
其他更改包括 CupertinoContextMenu
现在支持溢出屏幕时的滚动;CupertinoDatePicker
不再裁剪列中的长内容;CupertinoMagnifier
通过提供放大比例来支持放大效果。
在本次更新中,CardTheme
、DialogTheme
和 TabBarTheme
已经重新设计,使其符合 Flutter 的组件主题规范。我们还新增了 CardThemeData
、DialogThemeData
和 TabBarThemeData
,以覆盖这些组件的视觉属性默认设置。未来我们会继续调整这些组件主题,使其更加规范,从而在材料组件库中提供更加一致的主题体验。
此版本引入了 CarouselView.weighted
,让轮播的布局更加灵活多变。通过在构造函数中调整 flexWeights
参数,你可以实现各种项目布局。例如,[3, 2, 1] 可创建一个 multi-browse 布局,[7, 1] 可生成一个 hero 布局,[1, 7, 1] 可创建一个 centered-hero 布局。这些值代表每个项目在轮播视图中所占的相对比例,可以自定义以满足用户的具体需求和偏好。
这次更新包含了一些小的功能改进和错误修复:例如
SegmentedButton
现在可以将项目条目垂直排列。
- 在
ButtonStyleButton
类的styleFrom
方法中增加了更多与图标相关的属性,以便提供更多自定义选项。这些类包括ElevatedButton
、FilledButton
、OutlinedButton
、TextButton
、MenuItemButton
和SubmenuButton
。
一些修复 bug 的例子:
- 对于
ButtonStyleButton
类的图标大小和颜色默认值,现已与 Material 3 规范保持一致。 - 当导航抽屉打开时,AppBar 的滚动下行为现在正确地保持一致,与原生 Android 体验相同。
MenuAnchor
现已修复了焦点问题,并且修复了多个DropdownMenu
的问题,包括在嵌套滚动视图中的滚动问题和过滤机制的行为问题。
ModalRoutes 现在在前一个路由和新路由具有不同的页面过渡效果时更加灵活。当新路由进入屏幕时,有时需要前一个存在的路由执行特定的过渡动作,以便与新路由的进入过渡效果同步。现在 ModalRoutes
可以为彼此提供退出过渡构建器,使得进入和退出过渡效果可以保持同步。这样,页面就可以在使用 Flutter 的 Navigator 和 Router 时,在同一页面上使用多种路由过渡效果。
Flutter中的SelectionArea
现在支持在Linux、macOS和Windows系统中通过Shift + 单击将选择范围扩展到单击位置,用户可以进行此操作。
你现在也可以通过 [clearSelection](https://main-api.flutter.dev/flutter/widgets/SelectableRegionState/clearSelection.html)
方法清除 SelectionArea
下的选区和 SelectableRegion
中的选区。通过向 SelectionArea
提供一个 GlobalKey
并访问其 [SelectionAreaState.selectableRegion](https://main-api.flutter.dev/flutter/material/SelectionAreaState/selectableRegion.html)
,你现在可以直接获取 [SelectableRegionState](https://api.flutter.dev/flutter/widgets/SelectableRegionState-class.html)
。
我们也解决了一些与 RenderParagraph
相关的问题,因此在调整窗口大小之后,在 SelectionArea
或 SelectableRegion
下选择文本仍然可以按预期工作,点击或轻触文本外部时同样适用。
这次更新还新增了一个使用行和列时的便利功能——间距!这个双参数会在行和列中的子元素之间添加一个固定的像素偏移量,减少之前需要编写的代码量。
我们很高兴地与大家分享,Impeller 现已成为现代 Android 设备的默认渲染引擎。自从 Flutter 在 2023 年 11 月发布 3.16 稳定版以来,Impeller 在这些设备上已经处于预览阶段,基于用户的反馈,我们在性能和保真度方面都做了很大的改进。
在较早版本的 Android 设备和不支持 Vulkan 的设备上,仍然会使用原有的 Skia 渲染引擎。虽然我们认为 Impeller 的性能和画质都非常高,用户可以通过传递 --no-enable-impeller
参数给 flutter
命令行工具,或在 AndroidManifest.xml
文件中添加以下内容来退出 Impeller 并回到旧版 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
对象的内存使用。 - 在多视图模式下,改进了拖动滚动。
Flutter 正在转向使用 Swift 包管理器,这带来了一些好处。
- 能够访问Swift包生态系统。Flutter插件可以利用不断增长的Swift包生态系统。
- 更方便的Flutter安装。Swift Package Manager已经集成到Xcode中。未来,您将不再需要安装Ruby和CocoaPods就能在苹果平台上使用Flutter。
之前,Swift Package Manager 支持仅限于 Flutter 的“main”渠道。我们很高兴地告诉大家,Swift Package Manager 功能现在也支持“beta”和“stable”渠道了!目前,Swift Package Manager 功能默认是关闭的,我们正在解决一些问题,以进一步完善这项功能。
鼓励插件作者为插件添加对[Swift 包管理器](https://docs.flutter.dev/packages-and-plugins/swift-package-manager/for-plugin-authors#如何为现有的 Flutter 插件添加对 Swift 包管理器的支持)的支持功能。许多流行插件——包括Firebase,plus 插件(例如),以及更多——已经转向使用 Swift 包管理器!
现在,pub.dev 开始检查插件是否与 Swift Package Manager 兼容。不兼容的包将无法获得完整分数。
如果你对 Flutter 对 Swift 包管理器的支持有任何反馈,请在这里提交反馈。提交反馈
Android 边到边 — 极致体验默认情况下,在运行 Android 15+ 的设备上,你的应用将使用屏幕边缘到边缘模式并全屏运行!有关此更改的详细信息以及如何退出此行为,请参阅指南。
Android Freeform 允许用户调整应用窗口的大小,并作为开发者选项一直可用。Flutter 的 SafeArea
和 MediaQuery
已更新,以处理自由形式窗口移动到硬件缺口的情况。
现在开发人员可以使用 build.gradle.kts
文件。
Flutter 工具现在支持 Kotlin 构建文件。如果您遇到不支持 Kotlin 的情况,请提交一个错误报告。Groovy 仍然是支持的 Gradle 脚本语言。
Flutter 3.27将是最后一个支持 Gradle 的旧版apply脚本方法的版本。请参阅以下迁移文档: 迁移文档。
请注意:大多数应用程序需要手动迁移数据/代码。新创建的应用程序将将使用 Kotlin 构建文件。
采用声明式包含 Flutter Gradle 插件有助于 Flutter 项目迁移到使用 Kotlin 的构建文件,从而增强类型安全性并使构建代码的单元测试更容易维护。这也是一个更广泛努力的一部分,旨在为 Android 工具版本带来更多稳定性。
生态圈 Flutter 和 Dart 包生态峰会 2024 美国作为2024年9月Fluttercon USA的一部分,我们举办了Flutter和Dart生态系统峰会。这是我们第二次面对面的峰会,紧随2024年7月的Fluttercon Europe峰会之后,还有我们在2023年8月举行的第一次虚拟峰会。此处的讨论会要点总结可以在这里查阅:here。
峰会汇聚了包作者和维护者,围绕以下主题进行了非正式的讨论:
- 第一部分 — 添加对 Swift 包管理的支持
- 第二部分 — 原生互操作的过去、现在和未来
- 第三部分 — 可持续维护包的方法
我们正期待着继续与社区一起举办更多类似的峰会。
pub.dev上的包的下载次数我们推出了 pub.dev 上的下载次数统计!
网站的问题跟踪器中,长期以来,pub.dev上提供更精确的流行度指标是最受欢迎的功能。
现在,当你查看一个包页面时,你将看到一个30天内的下载次数,代替了原来的“受欢迎程度”。
此外,我们添加了一个互动的迷你折线图,显示随时间变化的每周下载活动。此图表帮助开发人员和包作者发现包使用趋势。例如,它可能表明新版本的发布导致使用量突然增加,或者一个包正在变得越来越受欢迎,或者越来越不受欢迎。
每次从 pub.dev 下载该包时,系统都会记录一次下载。如果该包还没有在你的 pub 缓存中,当你运行 flutter pub get
命令时,会下载安装该包。
这些下载数量是原始下载数量,反映了来自CI系统、包的使用情况分析、人类用户客户端等的使用情况。
我们将与Dart 3.6一起推出Pub Workspaces,以支持在一个单一代码库中开发多个相关包。
通过定义一个根 pubspec,该根 pubspec 引用仓库中的其他包,在仓库中的任何位置运行 pub get
,都会得到所有包的共享依赖解析。这确保所有包使用一致的依赖项进行开发。
共享的解析结果也被解析器识别,现在解析器只需要为整个工作区维护一个分析环境,从而可能在你将整个代码库加载到IDE时显著减少内存使用。
在 GitHub 上自动发布 Flutter 包我们扩展了 setup-dart 发布 GitHub Actions 工作流,使其能够自动化地发布 Flutter 包到 pub.dev,使为 Pub 生态系统做贡献变得更加容易和可验证。
互动媒体广告插件发布我们发布了一个Interactive Media Ads (IMA) Flutter插件,让在Flutter构建的iOS和Android应用中轻松集成多媒体广告变得简单。该IMA插件可以从任何VAST兼容的广告服务器请求广告,并管理广告在您的应用中的播放。广告在应用内容视频播放器上方的一个独立视频播放器中播放。当前支持的功能有:
- 客户端的 API 用于在线视频广告请求
- VAST & VMAP
- 单个及组播请求
- 可跳过的广告
我们已在 in_app_purchase_storekit
包中添加了对 StoreKit 2 的支持,以从 StoreKit 1 API 迁移到 StoreKit 2,这些 API 已在 iOS 18 中弃用。这使我们能够在未来添加新的 StoreKit 2 功能,例如更好的订阅管理。敬请期待即将发布的迁移指南,它将帮助您过渡到新的 StoreKit 2 功能。这是一个非破坏性更改,您可以根据需要随时进行迁移。
这个版本包括新功能,整体提升了稳定性和完善性,还有一些可以在开发者工具里开启的激动人心的新实验功能。要了解更多关于这些功能的信息,请往下看[预览和实验性功能]部分。
首先,我们为 Flutter Deep Links 工具增加了支持验证 iOS 深层链接设置的功能。你现在可以验证 Android 和 iOS 的深层链接了。
iOS 深链验证在 DevTools 深链验证工具中。
接下来,我们对处理“脱机”数据的工作流程进行了一些改进。有时,你可能需要将你在DevTools中查看的数据导出,以便未来使用或加载到其他工具上。这次更新还增加了将Network数据导出为.har
文件的功能,以及当DevTools没有连接到正在运行的应用程序时,导入内存快照以供查看的功能。
此外,如果你曾经在使用 DevTools 调试内存问题的过程中,因为应用程序崩溃而丢失了内存工具的数据(也许正是你试图调试的 OOM 问题),我们理解你的挫败感!我们已经解决了这个痛点,让你即使在应用断连后,依然可以在 DevTools 中查看最新的内存工具快照。
以下只是此次发布中的一些亮点。要了解更多 Flutter 3.27 的更新内容,请查看 DevTools 的发布说明文档 2.38.0,2.39.0,和 2.40.1。
试一下预览和实验性功能 Flutter DevTools — 新的 Flutter 檢視器Flutter Inspector 做出了一些重大改进,以提高使用方便性并让您的 UI 调试更加轻松。通过切换“启用新 Inspector”设置来启用新 Inspector。
在 DevTools 中的新 Flutter 检查器,
其中一些变化包括:
- 一个简化版的Widget树,让深入查看Flutter Widget树变得更容易。这在使用IDE内的Flutter Inspector时特别有用,因为在这种情况下屏幕宽度有限。
- 一个选项,用于切换是否包含实现Widgets。实现Widgets是指您没有在代码中包含的Widgets,而是由Flutter框架或其它包自动添加到Widget树中的。
- 提供所选Widget的详细视图,显示内联布局视图、Widget和渲染对象属性,以及Flex及其子Widget的弹性布局探索器。
新 Inspector 的更多改进即将推出,但这些变化现在可以供您试用了!如果您发现任何问题,请通过 这里 提交反馈,这样我们就可以在新 Inspector 默认启用前修复这些问题。
Flutter DevTools—使用 WebAssembly可以通过启用 DevTools 设置中的 WebAssembly 功能项来加载编译成 WASM 的 DevTools 网页应用程序。
这应该比默认编译的 DevTools 版本有更好的性能。此功能目前处于实验阶段,因此,如果使用 WASM 构建时遇到任何问题,请报告 问题。
DevTools 设置选项,使用 WebAssembly 版本而不是 JavaScript 版本
瑞典语翻译的重大更改和废弃功能 材料设计 3 Tokens(Tokens)最新的 Material Design 3 令牌(v6.1)已应用于 Flutter Material 库,使其更加符合 Material Design 的规范。Material Design 令牌仅在浅色模式下更新了 4 种颜色角色的映射关系,使其在保持可访问对比度的同时,更具视觉吸引力。我们在测试过程中未发现任何问题,此更改涉及这些颜色属性:
- 主要容器(Primary10 到 Primary30)
- 次级容器(Secondary10 到 Secondary30)
- 三级容器(Tertiary10 到 Tertiary30)
- 错误处理容器(Error10 到 Error30)
这会影响那些将这些角色作为默认值的组件。
Chip
(包括ActionChip
、ChoiceChip
、FilterChip
和InputChip
)的边框颜色从ColorScheme.outline
更改为ColorScheme.outlineVariant
。这提升了芯片和按钮之间的视觉区分度。
自 2019 年发布的 Flutter 1.9.1 以来,新的 iOS 项目默认使用 Swift。从现在开始,创建新的 Objective-C iOS 项目不推荐使用(详情见 此处),在未来的 Flutter 版本中,flutter create --ios-language objc
标志将会被移除。您可以继续使用 Xcode 打开项目并在其中添加 Objective-C 文件,包括插件相关的文件。而对于 Android 应用,Java 依然可以通过 flutter create --android-language java
参数得到支持。
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 发布起,我们将不再支持旧版本的 Dart SDK(该版本低于 3.0,于 2023 年 5 月发布的版本)。这意味着虽然工具仍可与较旧版本兼容,但我们不再为这些问题版本提供官方支持或修复。
随着 Dart 3.7(预计于 2025 年第一季度发布)的到来,我们将完全不再支持这些旧版 SDK 版本。未来发布的插件可能与此版本不兼容。
这对你来说意味着什么?
- 如果您还在使用较旧版本的 Dart SDK,我们鼓励您升级到 3.0 或更高版本,以继续获得支持和更新。
- 此更改将影响不到 1% 的用户群体,并将使我们能够为绝大多数开发者提供最佳体验。
请参阅破坏性更改页面上的完整迁移指导,了解此版本中的所有重大变更。
一如既往,感谢社区为提供测试——这些帮助我们识别破坏性改动。想了解更多详情,请参阅Flutter的破坏性改动政策。
结论部分特别感谢整个 Flutter 社区,是你们让这次发布成为可能!你们的贡献、反馈和热情推动了 Flutter 的发展。我们对 Flutter 的未来超级兴奋,非常期待看到你们用 Flutter 3.27 做出的精彩应用。
要详细了解所有更改,请查看详细的发行说明和更新日志。想体验最新的功能了吗?只需运行flutter upgrade
,然后就可以开始构建应用了!
共同學習,寫下你的評論
評論加載中...
作者其他優質文章