Flutter 3.35 有哪些新功能?
前言
Flutter 3.35 已经发布,带来了令人兴奋的新功能、性能改进以及开发者体验的提升。在本篇博客中,我们将探讨此版本中的所有主要更新,并提供实用示例,帮助你充分利用这些新功能。
简介
欢迎来到 Flutter 3.35 的季度更新版本!此次更新专注于提升您的工作效率,带来了网页端有状态热重载(stateful hot reload)的稳定版本,以及 Widget Previews(组件预览)的实验性发布。得益于我们社区的共同努力,Flutter 3.35 包含了来自 168 位不同贡献者的 1108 次提交,其中有 39 位是首次加入我们的新贡献者。让我们一起来看看有哪些新特性!
Web
默认情况下,现已在 Web 上启用有状态热重载
我们非常激动地宣布,Flutter on the web 迎来了这一重要里程碑,并欢迎所有人将热重载功能加入到他们的网页开发工作流程中。
我们在实验阶段收到的积极反馈和问题报告对此帮助很大。Dart 和 Flutter 网络团队一直在努力改进热重载代码的性能,同时确保更多的代码更改可以成功进行热重载。
我们的目标是在所有平台上提供无缝且一致的热重载体验。虽然您仍然可以通过标志禁用此功能,但我们计划在未来的版本中移除该功能。
Wasm 试运行
为 anticipation 启用 WebAssembly (Wasm) 作为默认的网页构建目标,每个 JS 构建现在都会执行一次 Wasm 的“试运行”编译。一系列检查会判断你的应用程序是否具备 Wasm 就绪条件,并将任何发现作为警告输出到控制台。此功能可以通过 --(no-)wasm-dry-run
标志进行切换。
有什么新功能?
以前,你需要在网页上使用一个实验性标志来显式启用有状态的热重载。而现在,当你运行 Flutter 网页应用时,有状态的热重载已经开箱即用了!无论你是通过命令行运行 Flutter 网页应用,还是通过 IDE 或代码助手启动它,只需以开发模式运行即可自由使用热重载功能。
用于启用热重载的 --web-experimental-hot-reload
标志已不再需要,您可以从工作流程或任何您可能配置的 IDE 启动配置中将其移除。
反馈
我们知道每个人的开发环境可能略有不同,因此如果此更改导致你的环境异常,你可以暂时通过标志 --no-web-experimental-hot-reload
禁用热重载。如果你发现任何问题,请使用 Dart 的 网页热重载问题模板 提交一个 bug。欲了解更多信息,请参阅 网页热重载文档 。
接下来是什么?
当前的积极工作将把热重载带到更多的开发环境中,包括 -d web-server
。我们期望这将在您进行网页开发时进一步提升您的生产力,因此请关注未来的版本更新!
框架
更具包容性和可访问性的体验
让所有用户都能访问应用程序是 Flutter 框架的核心原则。此版本延续了我们的承诺,带来了多项改进,为开发者提供了更多控制能力,并优化了辅助技术用户的开箱即用体验。
更丰富的语义支持
我们在 Flutter 网页应用与屏幕阅读器及其他工具的通信方式上取得了重大进展。针对国际用户,我们新增了对语义区域设置的支持(#171196),确保辅助功能能以用户首选的语言呈现。
构建无障碍组件的新工具
开发者现在拥有更强大的工具来创建复杂的无障碍体验。新的 SemanticsLabelBuilder
组件(#171683)简化了将多个数据点组合成单一、连贯提示信息的过程,而无需繁琐的字符串拼接操作。
对于复杂的可滚动视图,可以使用新的 SliverEnsureSemantics
组件(#166889)来包裹 sliver,以确保它们始终显示在语义树中,即使它们被滚动出可视区域。
核心小部件和平台改进
此版本包含大量改进核心组件可访问性的修复。
- 在 iOS 上,
CupertinoSliverNavigationBar
现在能够正确支持可访问性文本缩放(#168866),并且 VoiceOver 的标签页激活行为现在也能正常工作(#170076)。 - 对于 Android,现在使用平台视图时,Talkback 问题可以正常工作(#168939),这对于嵌入原生组件的应用来说是一个关键修复。
- 现在已为
CustomPainter
(#168113)填充了语义属性,使您能够实现完全可访问的自定义绘制 UI。 - 文本选择工具栏现在针对从右到左(RTL)的语言进行了正确对齐,改善了全球用户的使用体验(#169854)。
Material 和 Cupertino:更强大的功能与更精细的打磨
Material 和 Cupertino 库不断发展,让您对自己的应用外观和感觉拥有更多控制权。
新增和增强的组件
我们添加了全新的、备受期待的组件,并对现有组件进行了重大改进。
- 引入 DropdownMenuFormField(#163721): 现在可以轻松地将 M3
DropdownMenu
直接集成到你的表单中。 - 可滚动的 NavigationRail(#169421):
NavigationRail
现在可以配置为滚动,以便在屏幕无法容纳所有导航目标时使用。 - NavigationDrawer 头部和底部(#168005): 现在可以向
NavigationDrawer
添加头部和底部,从而提供更多的布局灵活性。 - 引入 CupertinoExpansionTile(#165606): 使用新的
CupertinoExpansionTile
小部件创建可展开和可折叠的列表项。
Press enter or click to view image in full size
更高的保真度和交互性
本次发布的一个核心主题是打磨我们的组件,使其在像素呈现上尽可能完美,并在行为上与其原生对应组件保持一致。
- 许多 Cupertino 组件已更新为使用
RSuperellipse
形状(#167784),从而呈现出 iOS 用户所期望的标志性连续圆角外观。 - 为了让应用感觉更加生动和原生,我们为一些关键的交互组件添加了触觉反馈,例如
CupertinoPicker
(#170641) 和CupertinoSlider
(#167362)。 - 现在可以将
Slider
的值指示器配置为始终可见 (#162223)。
更多来自框架的内容
本次发布包含了许多强大的新功能,并对框架中一些最关键的部分进行了改进,使您能够对复杂 UI 进行更精细的控制。
更强大的 Sliver 组件
对于构建复杂滚动体验的开发者,你现在可以显式地控制 sliver 的绘制顺序(或 z 顺序)(#164818),从而能够正确实现高级效果,例如“粘性”页眉覆盖其他 sliver 时不会出现视觉异常。
对导航和表单的更细粒度控制
我们新增了多项功能,以帮助您更好地控制应用的导航和路由。
- 全屏对话框(#167794): 向 ModalRoute(及其所有子类)以及
showDialog
添加了fullscreenDialog
属性。这使得可以自定义到对话框路由以及从对话框路由的导航行为。 - 表单改进(#167060):
FormField
现在包含了一个 onReset 回调,使得处理表单清除逻辑变得更加容易。
多窗口支持(引擎)
Canonical 的朋友们在为 Flutter 添加多窗口应用支持方面继续取得了出色进展!在本次发布中,他们完成了在 Windows 和 macOS 上创建和更新窗口的基础逻辑功能 (#168728)。后续版本将更新 Linux 并引入实验性 API 来暴露多窗口功能。敬请期待!
文本输入和选择改进
文本输入是用户体验的基本组成部分,本次发布带来了多项改进,使其更加强大且可预测。
- 更统一的手势系统: 引入
PositionedGestureDetails
接口 (#160714) 统一了所有基于指针手势的细节,使你可以编写更通用的手势处理代码。 - iOS 单行滚动(#162841): 为了更好地与原生 iOS 行为保持一致,单行文本字段现在不再支持用户滚动。
Android 首行/末行按键支持(#168184): 我们已在 Android 上添加了对 Home
和 End
键盘快捷键的支持。
展望未来:解耦 Flutter 的设计库
随着 Flutter 生态系统不断发展和成熟,核心框架也必须随之进步。这一成熟过程中的关键部分是确保 Flutter 的所有部分都能以最符合社区需求的节奏进行演进。
为此,我们正开始将 Material 和 Cupertino 库从核心 Flutter 框架中移出,放入它们各自的独立包中。这项工作刚刚起步,与往常一样,我们将会公开透明地与贡献者社区合作推进这项工作。
为什么会有这样的变化?
这一演进将使 Material 和 Cupertino 库能够更灵活地进行创新并更频繁地发布更新,不再受限于 Flutter 每季度一次的发布周期。同时,这也使社区能够更直接地参与他们每天使用的 UI 库的开发贡献。对于核心框架而言,这一变化将带来一个更加专注且稳定的基石。
这对您意味着什么?
您的工作流程不会立即发生变化。这是一个长期项目的开端,我们致力于让最终的过渡尽可能顺畅。我们邀请您关注我们的进展,了解更多相关计划,并分享您的反馈意见。
- 要阅读详细的愿景和原理,请参阅:Flutter 中的设计解耦 。
- 如果您想提供反馈或协助协调相关工作,请在 GitHub 上参与讨论 。
这对于一个成熟且蓬勃发展的生态系统来说是一个自然的演进。我们相信,这一变化将促使 Material 和 Cupertino 库变得更加强大和灵活,并为社区协作创造更大的机会。
iOS
iOS 26 和 Xcode 26 beta 兼容性
我们正在积极致力于使 Flutter 兼容 iOS 26 测试版 。请通过在最新测试版上测试您的应用和插件,并 提交您发现的任何新问题 来帮助我们。您可以通过此 GitHub 项目 跟踪我们的进度,并查看已知问题列表。
Android
敏感内容保护
在 Android 上,现在你可以通过在 Flutter 应用中使用 SensitiveContent
小部件来保护媒体投影期间的敏感用户内容。使用 API 35 及更高版本时,你可以使用此小部件在屏幕共享期间模糊整个屏幕,从而帮助防止数据泄露。有关此功能及其使用方法的详细信息,请查看 保护敏感内容 。
引擎
通用引擎更新
3.35 版本继续专注于提升 Impeller 的性能和兼容性。此外,还投入了资源以在 iOS 上采用 UISceneDelegate
,并引入了更多工具改进。以下是一些重要的新增内容。
引擎
- 优化:通过在新线程上执行初始化操作,应用启动时间已减少。
Impeller(引擎)
- 优化:从中间目标中移除了 MSAA。
- 保真度:移除了有损纹理压缩的默认设置。
- 修复:修复后续绘制中卡住的
MaskFilter
。 - 优化:路径渲染。
- 新增:添加了 Vivante GPU 支持。
- 优化:
DrawImageNine
现在使用快速的 Porter Duff 混合模式。 - 修复:修复了 VideoPlayer 中的内存泄漏问题
- 保真度:增加了模糊半径计算,以在使用大 sigma 值时获得更清晰的模糊效果。
iOS
- 修复:解决了被
ClipRSuperellipse
包裹的WebView
中的崩溃问题。 - 修复:从远程通知在后台启动应用时,图像解码现在可以正常工作。
- 复兴:恢复了文本字段中的实时文本(OCR)选项。
Android
- 迁移:模板项目已迁移到 Android 24。
- 修复:修复了在 Android <= 14 上由于后台图像读取器导致的崩溃问题。
- 修复:修复了 OpenGLES Impeller 中片段着色器中的 uniform 数组问题。
- 修复:修复了 OpenGLES Impeller 中倒置的片段着色器通道。
- 修复:修复了
FlutterEngineGroup
中的崩溃问题。
macOS
- 修复:修复了显示 P3 颜色的问题。
开发工具和集成开发环境(IDE)
Dart 和 Flutter MCP 服务器现已进入稳定版通道
实验性的 Dart 和 Flutter MCP 服务器 现已在 Dart SDK 的稳定版通道中提供。这标志着我们为每一位 Dart 和 Flutter 开发者打造高效、AI 辅助开发体验的愿景迈出了重要一步。
增强的 Dart 和 Flutter 上下文支持 AI 编码助手
Dart 和 Flutter MCP 服务器充当了一个桥梁,让 AI 编码助手能够通过 Dart 和 Flutter 工具链访问你项目中的更多上下文信息。你的 AI 助手现在不仅可以提供代码建议,还能深入理解你的项目,并代表你执行操作。这使你能够专注于自己的目标,而将具体实现细节交给 AI 来处理。
借助 Dart 和 Flutter MCP 服务器,你可以要求你的 AI 助手执行以下操作:
- 修复运行时错误 :检查实时 widget 树,识别 Flutter RenderFlex 溢出,并自动应用正确的修复方案。
- 管理依赖项 :在 pub.dev 上找到适合特定任务的最佳包,将其添加到你的
pubspec.yaml
文件中,然后运行pub get
。 - 编写和修正代码 :为新功能生成样板代码,然后自我修正在此过程中引入的任何分析错误。
- 以及更多……
连接到你喜爱的 AI 工具
通过将您喜爱的 AI 工具(如 Gemini Code Assist、Firebase Studio、Gemini CLI、GitHub Copilot 和 Cursor)连接到 Dart 和 Flutter MCP 服务器,您可以解锁全新的生产力水平。
有关 Dart 与 Flutter MCP 服务器的功能以及如何在你选择的编辑器中配置它的完整指南,请查看我们的详细博客文章 使用 Dart 与 Flutter MCP 服务器提升你的 Dart & Flutter 开发体验 ,以及 文档 。
Press enter or click to view image in full size
修复布局问题,由 Dart 和 Flutter MCP 服务器提供支持(注意:为简洁起见,此录制视频的某些部分已加速播放。)
DevTools 更新
我们继续对 DevTools 进行了整体改进,并优化了用户体验和性能。要了解 Flutter 3.35 中包含的所有更新内容,请查看 DevTools 的发布说明:2.46.0、2.47.0 和 2.48.0。
实验性的小部件预览功能现已上线!
社区一直强烈要求的一项功能是能够单独预览组件(widget),类似于其他现代 UI 工具包中提供的功能。我们听到了大家的呼声,今天,我们非常高兴迈出解决这一需求的第一步,推出了实验性初期版本的 Flutter Widget Previews,现已在稳定版渠道中提供!
Flutter 的有状态热重载在对运行中的应用进行快速迭代方面已经是业界领先。Widget 预览功能进一步增强了这一点,它允许你在沙盒环境中可视化并测试你的组件,完全独立于完整的应用程序。当你在构建设计系统,或者需要同时并排测试组件在不同配置下的表现(例如各种屏幕尺寸、主题和文字缩放比例)时,这一功能非常宝贵。
Press enter or click to view image in full size
在 Widget 预览中尝试主题设置
这是一个早期的实验性版本,您的反馈对于塑造其未来至关重要。目前的 API 和用户体验尚未稳定,并会随着我们从您的反馈中学习而发生变化。根据早期的反馈,我们已经在规划未来的改进,包括:
- 更紧密的 IDE 集成 :我们计划超越当前独立的浏览器窗口模式,提供一个可选的嵌入式预览面板,直接集成在 VS Code、Android Studio 和 IntelliJ IDEA 中。
- 通用主题支持 :随着我们按照本文前面提到的计划将 Material 和 Cupertino 设计库从核心框架中解耦出来,Widget 预览功能也将不断发展,以更有效地支持自定义和通用的设计系统。
我们非常激动能将这一版本交到您的手中。要开始使用,请查看文档并告诉我们您的想法!
- 阅读文档 : 开始使用 Flutter Widget 预览器(实验性功能)
- 提供反馈 :在 Flutter GitHub 仓库中提交问题和功能请求。
- 了解更多 :如需深入了解技术细节,请参阅 Flutter Widget Previews 架构文档 。
分析服务器速度改进
现在,使用分析服务器的 dart 命令行工具 命令会运行 AOT 编译的分析服务器快照。这些命令包括 dart analyze
、dart fix
和 dart language-server
。
使用 AOT 编译的分析服务器快照在功能上没有差异,但各种测试表明,分析项目所需的时间有显著的提升。在我们对一个示例包运行一些常用命令后,看看统计数据的变化:
Press enter or click to view image in full size
结果因源代码而异,但总体而言,一些短命令(如格式化)现在只需极短的时间即可完成,而像分析这类较长的命令也快了将近 50%。这将使你在日常使用该工具时感觉更加灵敏,并且在 CI 系统中运行的常见测试工作流程中可能会产生显著的差异。
Android Studio 和 Jetbrains IDE 插件更新
随着 Flutter IntelliJ 插件 M87 版本的发布,现在已支持 Android Studio Meerkat 和 Narwhal。从这个版本开始,Flutter 插件还可以安装在 CLion、GoLand、PyCharm 以及多个其他 JetBrains IDE 上!完整支持列表请参见此处的 支持产品 。感谢 Alex Li(Flutter 和 Dart GDE),他的 PR #7949 以及与我们团队的认真协作,成为扩展插件所支持的 JetBrains IDE 数量的重要推动力。
有关所有更新和修复的列表,请查看我们的更新日志并在此处提交问题 。获取最新更新: 设置 > 插件 > Flutter > 更新 。
考虑订阅开发频道,以便在每周发布最新更新时进行测试。相关说明请参见此处 。
Flutter IntelliJ 插件版本 M87 支持的完整 IDE 列表如下:
重大变更和弃用内容
此版本包含若干重要的弃用和破坏性变更,这些变更是我们持续推进 Flutter 框架现代化和改进工作的一部分。
- 组件主题规范化: 此版本标志着一个重要的长期项目完成,该项目旨在规范化组件主题。为了使主题更加一致并符合 Material 3,诸如
AppBarTheme
、BottomAppBarTheme
和InputDecorationTheme
这类组件主题已被重构,基于新的、以数据为导向的…ThemeData
类进行构建。 - 单选按钮组件重构:
Radio
、CupertinoRadio
和RadioListTile
组件已重构以提升可访问性。groupValue
和onChanged
属性已被弃用,取而代之的是新的RadioGroup
组件,用于管理一组单选按钮的状态。 - 表单组件和可滚动组件:
Form
组件现在不能直接作为 sliver 使用。要在CustomScrollView
中包含Form
,应将其包裹在SliverToBoxAdapter
中。 - 语义 elevation 和 thickness 移除:
elevation
和thickness
属性已从SemanticsConfiguration
和SemanticsNode
中移除。这些属性之前未实现,移除它们可简化 API。 - DropdownButtonFormField 的 value 参数弃用:
value
参数在DropdownButtonFormField
上已被弃用,并重命名为initialValue
,以更准确地反映其行为。
有关更多详细信息和迁移指南,请参阅我们的 重大更改页面 。
弃用 32 位 x86 架构(Android)
Flutter 已在 Android 上弃用 32 位 x86 架构。对于大多数开发者来说,这不会产生影响,因为它主要影响较旧的基于 x86 的 Android 模拟器和少量实体设备。32 位 ARM 以及 64 位 x86_64 的模拟器和设备仍受支持。完整的技术说明可在 Dart GitHub 弃用问题页面 查看。
已弃用对旧版 Flutter SDK 的 IDE 支持
随着本次发布,我们将停止对 Flutter SDK 3.13 之前版本的 IDE 支持。
在我们的下一个稳定版本中,Flutter 3.16 之前的 SDK 将被弃用。
要了解有关 Flutter 弃用策略的更多信息,请访问 Flutter 兼容性 页面。要了解有关 IDE 弃用策略的更多信息,请访问 SDK 对 Flutter 开发工具的支持 。
如果您使用的是较旧的、已不再受支持的 Dart 或 Flutter SDK,请务必下载兼容版本 。
最低 Android SDK 已更改
Flutter 所支持的最低 Android SDK,由 flutter.minSdkVersion
提供,现在为 API 24(Android 7)。如果你已将此值修改为非 flutter.minSdkVersion
的其他值,则需要将其提升至至少 24。
此外,Flutter 对某些 Android 特定依赖项的最低要求值也有所提高。如果你需要增加这些值,Flutter 工具会通知你,并提供如何升级的指导(如果工具没有打印任何警告,则无需采取任何操作)。
你现在至少需要拥有:
- Gradle 版本:8.7.0
- Android Gradle 插件 (AGP):8.6.0
- Java:17
为了解决 AGP 和 Gradle 问题,可以在 Android Studio 中运行 AGP 升级助手 ,或者从命令行运行它 。
移除 pluginClass:无
在未来版本的 Flutter 中,将移除对插件 pubspec.yaml
文件中 pluginClass: none
的支持,任何使用此字段的插件都应将其删除以确保向前兼容性。所有较新版本的 Flutter 都支持在没有对应平台原生代码时省略 pluginClass:
条目。
结论
Flutter 3.35 是我们共同努力为所有人打造更佳开发者体验的成果。我们衷心感谢社区成员的贡献与反馈,包括 Canonical 等团队,他们帮助实现了网页热重载和 Widget 预览等功能。正是你们的热情推动着 Flutter 不断前进,我们非常期待看到你们利用这些新工具创造出令人惊叹的作品。
如需查看所有更改的完整列表,请务必查阅详细的发布说明和变更日志。要开始使用 Flutter 3.35 中的所有功能,请运行 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