Flutter 3.32 中的新内容
介绍
欢迎来到 Flutter 3.32!此版本包含许多功能,旨在加速您的开发并增强您的应用程序。准备好在网页上体验热重载、实现原生保真的精美 Cupertino 圆角矩形,以及通过 Firebase 实现的强大新 AI 集成吧。Flutter 3.32 汇集了来自 156 位独特贡献者的 1024 次提交,其中包括 39 位首次贡献者,这是对我们社区卓越工作的证明。让我们一起探索其中的新内容吧!
Web
网页上的热重载(实验性)
我们很高兴地宣布,您现在可以在网页上进行热重载了!网页端的热重载支持是 Flutter 跟踪器上 #2 最受期待的问题 。我们很高兴能给您一个机会,在您自己的项目中尝试这一功能! 我们希望得到您的帮助,以确保这一令人兴奋的新功能能够满足开发人员的所有需求。
如果你发现任何问题,请使用 Dart 的 Web Hot Reload 问题模板提交 bug。你可以在 Web Hot Reload Known IssuesGitHub 项目中找到已知问题的列表。
现在是有趣的部分:如何使用该功能
我们添加了一个简单的命令行标志 --web-experimental-hot-reload
,您可以在任何调用 flutter run
的地方将其传递给 Flutter。
从 VS Code 运行
如果你在 VS Code 中使用调试配置,可以将此额外配置添加到你的 launch.json 文件中:
"configurations": [
…
{
"name": "Flutter for web (hot reloadable)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": [
"-d",
"chrome",
"--web-experimental-hot-reload",
]
}
]
为了获得最佳效果,我们建议在 VS Code 中启用“Dart: Flutter Hot Reload On Save”设置。也可以通过运行/调试面板中的⚡图标触发热重载。仍然可以使用⟳按钮触发热重启。
从命令行运行
如果你在命令行中使用“flutter run”,现在可以通过以下方式在网页上运行热重载:
flutter run -d chrome --web-experimental-hot-reload
当启用了热重载时,您可以通过在运行中的终端按下“r”来重载应用程序,或者按下“R”来进行热重启。
在 DartPad 中重新加载
热重载现在也在 DartPad 上可用,并带有一个新的 Reload 按钮。此功能仅在检测到运行中的应用程序使用 Flutter 时可用。您可以使用 DartPad 提供的 示例应用 来尝试该功能。
感谢您抽出时间帮助我们让网页上的热重载变得出色!
框架
我们继续努力将逻辑从 Material 库移动到 widgets 库。
此版本引入了一个新的 Expansible
小部件,它使得创建具有不同视觉主题的可扩展和可折叠小部件变得更加容易。这个新小部件是 Material 风格的 ExpansionTile
的底层构建块。
此版本中的另一项重要新增功能是 RawMenuAnchor
,由社区成员 @davidhicks980 贡献。此小部件现在成为了 Material 风格的 MenuAnchor
的底层构建块,为创建具有多样化视觉主题的菜单铺平了道路。此外,RawMenuAnchor
还可以作为无样式菜单独立使用,让您完全掌控其外观。
像这样的重构增加了对核心小部件的支持,使其能够更好地用于实现类似 Cupertino 和 Material 的设计语言(以及更多!),并具有更一致的表面和代码共享。
Cupertino
圆角矩形
我们很高兴介绍 Flutter 形状功能的一项重要新添加内容:圆角超椭圆。
通常被称为“苹果圆角矩形”的这种形状是 iOS 设计语言的基石,以其比传统圆角矩形更平滑、更连续的曲线而闻名。Flutter 社区经常要求支持这种形状。它的加入代表了我们在 Apple 平台上提供具有原生外观和感觉的高保真 UI 的又一步努力。
两者 CupertinoAlertDialog
和 CupertinoActionSheet
都已更新为使用这种新形状!
您可以使用这些新 API 将圆角超椭圆添加到您的应用程序中:
RoundedSuperellipseBorder
用于绘制或作为小部件形状ClipRSuperellipse
用于剪裁。Canvas.drawRSuperellipse, Canvas.clipRSuperellipse
,以及用于更低级别 API 的Path.addRSuperellipse
,它提供了更直接的控制。
请注意,圆角超椭圆目前正在积极开发中。目前,它仅在 iOS 和 Android 上受支持,否则行为将回退到标准的圆角矩形。性能优化也在进行中。我们鼓励您在考虑这些因素的情况下探索此新功能,并期待在未来更新中增强其功能!
表单
Cupertino 弹出框也解决了几个问题,包括修复了弹出框在 Android 上打开时设置系统 UI 主题的方式。
调整了工作表以修复导航栏的高度,并确保内容不会在底部被截断。以下截图展示了此更改的前后效果。
此版本中的其他修复包括解决了一个问题,即表单过渡与 PopupMenuButton
不兼容,同时改进了表单的圆角过渡效果,使其在更多设备上显示正确。之前,在某些具有不同圆角半径的屏幕上,它显示不正确。
您还可以在 CupertinoSheetRoute
和 showCupertinoSheet
上使用新的 enableDrag
参数,以禁用 Cupertino 底部弹出框的向下拖动以关闭行为。(#163923)
导航栏
CupertinoSliverNavigationBar.search
在打开或关闭搜索视图时,动画的保真度得到了改进,同时搜索字段的前缀和后缀图标也对齐正确。
最后,带有 CupertinoNavigationBars
或 CupertinoSliverNavigationBars
的路由之间过渡已更新为匹配最新的 iOS 过渡效果 (#164956)。
材质
此版本为 Material 库带来了一系列功能增强和错误修复,提升了功能性和开发人员的体验。
功能增强包括:
CarouselController
提供了一个更便捷的animateToIndex
方法,无论使用固定大小还是通过flexWeights
动态调整大小的项目,都可以实现基于索引的平滑轮播导航。
- TabBar 现在有了
onHover
和onFocusChange
回调,让你能够更好地控制小部件在不同状态下的外观。
SearchAnchor
和SearchAnchor.bar
现在分别包含viewOnOpen
和onOpen
回调,从而可以更好地观察和处理打开/关闭事件。
CalendarDatePicker
现在接受一个calendarDelegate
,以实现集成自定义日历逻辑的功能,而不仅限于公历系统。示例展示了一个假设的日历系统,在该系统中,偶数月份有 21 天,奇数月份有 28 天,并且每个月都从星期一开始,这充分展示了此委托所提供的灵活性。
其他小的改进包括在 showDialog
、showAdaptiveDialog
和 DialogRoute
中添加 animationStyle
,以自定义对话框打开和关闭时的动画;Divider
现在接受 borderRadius
,以便自定义分隔线的边框,尤其是在分隔线较粗时。
除了新功能之外,此版本还解决了 Material 库中与 DropdownMenu
和 Slider
相关的几个错误:
DropdownMenu
小部件现在允许其菜单宽度小于文本字段。示例已更新以解决之前的RenderFlex
溢出错误。DropdownMenu
的默认宽度现在会尊重文本字段中文本标签的宽度。- 当悬停在
RangeSlider
的滑块上时,只有被悬停的滑块的覆盖层会显示。之前,两个覆盖层都会错误地出现。现在,当轨道颜色为透明时,Slider
的滑块可以到达轨道的两端,克服了之前无法到达的限制。
无障碍功能
优化了语义树编译
此功能将语义编译时间减少了约 80%。在 Flutter for web 中,当启用语义时,这相当于帧时间减少了 30%。
引入细粒度的语义角色
一个新的 SemanticsRole
API 已被集成到 Semantics
小部件及其相关组件中,为开发人员提供了更精确的控制方式,以决定辅助技术如何解释 UI 元素。此增强功能允许通过使用配置了所需角色的 Semantics
小部件简单地包裹整个小部件子树,为其分配特定的角色。
可用角色的列表在官方 API 文档中有详细说明。目前,此高级语义角色功能适用于基于 Web 的应用程序,对其他平台的支持将在未来版本中提供。
For more information, see 通过语义角色增强可访问性 .
其他可访问性改进
- 改进的 widgets 和屏幕阅读器用户体验: 在各种 widgets 上提供了更好的无障碍支持和用户体验,包括文本框、焦点处理、菜单、滑块和下拉菜单。当用户与这些元素交互时,屏幕阅读器现在会提供更详细的反馈。
- 通过语义实现更平滑的网页焦点导航: 当启用语义时,优化了网页焦点行为,大大减少了小部件之间的突然焦点跳转,从而提供更直观的导航体验。
- 改进的 Android TalkBack 链接识别: Android TalkBack 现在可以正确识别并宣布使用
Semantics.linkUrl
或url_launcher
包中的Link
小部件定义的链接。 - Flutter for Web 在 Windows 上的高对比度模式支持: 引入了对 Windows“强制颜色”模式的支持(通常用于高对比度场景)。开发人员现在可以在
ThemeData
中设置useSystemColors
布尔值,以自动将系统颜色应用于 Flutter 主题,从而增强依赖这些设置的用户的可见性。 - 改进的 iOS 语音控制体验: 通过确保非可操作的小部件不再显示不必要的标签,改善了 iOS 语音控制的用户体验,从而为用户带来了更简洁、更专注的交互体验。
文本输入
此版本中的文本输入功能得到了多项改进:
- 系统文本选择上下文菜单在 iOS 上发布,相关内容参见下方的 iOS 部分。
Autocomplete
小部件选项的布局已迁移到OverlayPortal
,这提高了性能并修复了布局错误。- 现在可以在文本字段中自定义
onTapUpOutside
行为 (#162575)。 - 开发者现在可以生成任何他们想要的 widget 作为
FormField
的错误消息,而不仅仅是错误文本 (#162255)。 - Flutter 中的可选文本变得不那么不稳定 (#162228),并且在 Web 上的性能更高 (#161682)。
多窗口支持的进展
来自 Canonical 的贡献者在允许桌面应用程序拥有多个窗口方面取得了 excellent 进展!
Canonical 修复了多个窗口应用程序中损坏的若干功能:
Canonical 还添加了一个功能,允许 Dart 代码通过 FFI 直接与 Flutter 引擎通信(#163430)。这为 Flutter 未来的窗口 API 奠定了基础。
最后,Canonical 在 Linux 上引入了一个光栅线程(#161879)。这提高了帧传输效率,确保即使您有多个窗口,Flutter Linux 依然运行流畅。
桌面线程合并
Canonical 还更新了 Windows 和 macOS,以允许应用程序合并 UI 和平台线程(#162883,#162935)。
合并线程允许你使用 Dart FFI 与必须在平台线程上调用的原生 API 进行互操作。例如,如果你在 Windows 上启用了合并线程,你可以使用 Dart FFI 通过 win32 API 调整应用程序窗口的大小!
在 Windows 上,你可以通过将以下内容添加到 windows/runner/main.cpp
文件中,位于 wWinMain
方法内,来开启合并线程:
project.set_ui_thread_policy(UIThreadPolicy::RunOnPlatformThread)
在 macOS 上,您可以通过向 macos/Runner/Info.plist
文件的 <dict>
元素内添加以下内容来启用合并线程:
<key>FLTEnableMergedPlatformUIThread</key>
<true />
在未来的版本中,我们将在 Windows 和 macOS 上默认启用合并线程。请尝试使用此功能,如果遇到任何错误,请创建问题 !
iOS
我们提升了 Flutter 应用在 iOS 上的粘贴体验!对于没有自定义操作的基本文本框,用户在从其他应用粘贴内容时将不再看到确认对话框。此功能现在已在所有 Flutter iOS 应用中默认启用。请注意,如果您的应用使用自定义操作(例如上下文菜单中的“发送邮件”), 该功能尚不支持 。
Android
使用 Kotlin 语言重写 Gradle 工具
Flutter 的 Gradle 插件已从 Groovy 转换为 Kotlin。这种向 Kotlin 的转换使代码库更容易贡献,并且还促进了为该插件引入单元测试。新增的测试,以及从动态类型和执行语言转换为静态类型语言,应为 Flutter 开发者带来更稳定和可靠的构建过程。我们不期望因这次重写而导致任何行为变化,因此如果您发现 Android 构建的行为与您的预期不符,请提交一个问题 。
Scribe / Stylus 支持
现在您可以在 Android 上使用手写笔在文本字段中书写,就像 Apple Pencil 手写输入已经在 Flutter iOS 应用中实现一样。用户可以直接在任何 Flutter 文本输入框上开始书写,并且手写内容会以文本形式显示在该字段中。目前并非所有手势都已支持,但我们正在努力弥补这些差距 。此功能支持 Android 14 及以上版本,如果需要,可以通过 TextField.stylusHandwritingEnabled
或 CupertinoTextField.stylusHandwritingEnabled
参数将其禁用。
引擎
Android 上的 Impeller
从 3.29.3 版本开始,在运行 Android API 级别 28(Android 9)及更早版本的设备上,Flutter 应用将使用旧版 Skia 渲染器。此更改提高了 Flutter 在旧版 Android 设备上的稳定性。对于运行 API 级别 29(Android 10)及更高版本的设备,Impeller 仍然是默认渲染器。
随着我们从使用不同设备的用户那里获得更多反馈,我们调整了哪些设备使用 Impeller 的 Vulkan 后端,哪些使用 OpenGLES 后端。特别是在此版本中,以下设备将使用 OpenGLES 而不是 Vulkan:Android 模拟器 、API 版本低于 31 的 MediaTek 设备、早于 CXT 的 PowerVR 设备,以及不支持 Vulkan 1.3 的 Samsung XClipse GPU 的旧版本。
与之前的版本一样,您可以通过这些说明选择退出 Impeller。由于我们对 Impeller 的稳定性和性能越来越有信心,因此在即将到来的稳定版更新中,将移除在较新的 Android 设备上选择退出 Impeller 的功能。
最后,Flutter 3.27 在 Vulkan 能力设备上与 Impeller 渲染相关的存在一些渲染错误和崩溃问题,这些问题已在 3.29 及后续版本中修复。我们不计划将这些更改热修复到 3.27 中,并强烈建议更新到 3.29 或更高版本。如果您的应用无法进行更新,我们建议在 Android 设备上选择退出 Impeller。
其他 Impeller 更新
此版本改进了 Impeller 的文本渲染。特别是,由于 Impeller 的字形图集中的字形分辨率更高,并且修复了浮点运算中的四舍五入错误,文本动画更加流畅,抖动更少。更多详情请参见 flutter#149652。
之前
之后
此版本还包括许多其他关于保真度和性能的改进,包括:
开发者工具和集成开发环境
新功能 Flutter 属性编辑器
轻松编辑小部件属性并从新的属性编辑器工具中阅读文档,该工具可从 Flutter Property Editor 侧边栏面板(VS Code)或工具窗口(Android Studio / IntelliJ)访问。
VSCode
Android Studio & IntelliJ
DevTools 改进
在整个 DevTools 中还进行了其他改进,包括 Network 界面的新离线支持、与审查历史相关的错误修复、检查器错误修复、Deep Links 工具的改进以及 CPU Profiler 和 Memory 界面的数据改进。此版本还为 DevTools 带来了多项性能和内存改进,从而实现更快的数据加载时间和更少的内存相关崩溃。
这仅仅是此次发布的一些亮点。要了解 Flutter 3.32 中包含的所有更新,请查看 DevTools 2.44.0 和 2.45.0 的发行说明。
分析器改进
我们继续对 Dart Analyzer 进行改进,从而提升开发者体验。这包括添加“文档导入”功能,这是一种基于注释的新语法,允许在文档注释中引用外部元素而无需实际导入它们。请查看 dart.dev 上的详细信息。我们还进行了多项快速修复、辅助和重命名方面的改进。
现在,Android Studio 中的 Gemini 已经能够流利地使用 Flutter 和 Dart
Gemini 现在在 Android Studio 中为 Dart 和 Flutter 开发提供了顶级支持!这意味着您可以直接在您最喜欢的 IDE 中利用 Gemini 的强大功能,以前所未有的速度和 ease 构建美观、高性能的 Flutter 应用程序。
阅读这篇博客文章 以了解更多。
Dart 和 Flutter 对模型上下文协议(MCP)的支持即将到来
对模型上下文协议(MCP)以及最近发布的 Dart MCP SDK 的支持正在积极进行中。一个新的 Dart Tooling MCP Server 也在开发中,它将向 MCP 客户端(如 IDE)暴露 Dart 和 Flutter 的静态、运行时及生态系统工具。
这将为 Dart 和 Flutter 开发者带来以下好处:
- 更准确和相关的代码生成。
- 复杂的任务——比如修复布局问题、管理依赖项,甚至解决运行时错误——变得可行,因为 MCP 协议暴露了实际的 Dart 和 Flutter 工具的语义信息。
敬请期待!
与 AI 一起构建
引入 Firebase AI 逻辑
你可能听说过,甚至在 Firebase 中使用过 Vertex AI,这是我们用于将 Gemini API 驱动的功能直接集成到 Flutter 应用中的客户端 SDK。
你们中的许多人要求使用 Gemini Developer API,而不是 Vertex AI,以利用其慷慨的免费层级,并开始无成本地添加生成式 AI 功能。我们听到了你们的声音!从今天起,我们将把 Firebase 中的 Vertex AI 演进为 Firebase AI Logic,它通过一个 Flutter SDK 即可提供对 Gemini API 提供商的访问。这使您能够直接从 Flutter 应用中使用 Gemini 和 Imagen 模型,而无需使用服务器端 SDK。
查看 firebase_ai
包以获取新功能。如果你已经在使用 firebase_vertexai
包,它目前将继续正常工作,但我们鼓励你迁移到新包。
通过 AI 监控仪表板获取可操作的洞察
Firebase 控制台中的新 AI 监控仪表板为您的 Gemini API 使用情况提供了详细且可操作的见解。这包括对消费模式、性能指标和潜在问题的全面可见性。这使得能够基于数据做出决策,并确保您以最高效的方式使用 Gemini API。AI 监控还帮助您调试 Gemini API 的使用情况,识别并解决任何意外行为。
重大更改和弃用功能
Android 无障碍功能公告
在 Android 上,从 API 36 开始,语义公告事件已被废弃 。相反,请通过配置 SemanticProperties.liveRegion
使用“礼貌”隐式公告。目前,有一个已知的限制,即在宣布不应可聚焦的文本时存在问题。有关此限制及其解决方案的详细信息,请参阅问题 #165857。要查看替代解决方案,请查阅 SemanticService.announce 的文档 。
停止对6个包的支持
正如我们在 Flutter 3.29 发布博客文章 中计划和分享的,我们已经停止对以下软件包的支持:
flutter_markdown
;参见 flutter_markdown 计划停止维护 #162966ios_platform_images
;参见 ios_platform_images 计划停止使用 #162961css_colors
;参见 计划停止使用的 css_colors #162962palette_generator
;参见 计划停止使用的 palette_generator #162963flutter_image
;参见 flutter_image 停用 #162964flutter_adaptive_scaffold
;参见 计划停止使用的 flutter_adaptive_scaffold #162965
我们鼓励社区成员在每个问题的讨论中寻找替代方案。
iOS 和 macOS 的最低版本要求
Flutter 将在下一个稳定版本中停止对 iOS 12 和 macOS 10.14 (Mojave) 的支持,并将目标最低版本设为 iOS 13 和 macOS 10.15 (Catalina)。这意味着使用未来版本的 Flutter 构建的应用将无法在 iOS 12 或 macOS 10.14 上运行。
其他重大更改
此版本中的其他重大变更和弃用包括:
- 在 Material 中弃用了
ExpansionTileController
,转而使用 Widgets 层中新的可重用ExpansibleController
。 - 将
SelectionChangedCause.scribble
(已弃用)重命名为SelectionChangedCause.stylusHandwriting
,因为苹果的 Scribble 功能现在已与安卓的 Scribe 统一。 - 作为我们持续规范 Material 主题工作的部分内容,
ThemeData.indicatorColor
已被弃用,取而代之的是TabBarThemeData.indicatorColor
,而cardTheme
、dialogTheme
和tabBarTheme
的组件主题类型需要分别迁移到CardThemeData
、DialogThemeData
和TabBarThemeData
。 - 某些行为中的
SpringDescription
公式已得到修正。此更改修复了某些参数组合下行为不符合预期真实物理现象的问题,并且在临界阻尼点附近表现出不连续性。此问题影响质量值不是 1 的欠阻尼弹簧(阻尼比小于 1)。在此更改之前创建的此类弹簧在升级后可能会表现出不同的弹跳行为。若要恢复之前的动画行为,请根据 Spring Description 欠阻尼重大变更指南 更新您的弹簧参数,您还可以在其中找到 一个工具 ,该工具可以计算参数调整。
要查看此版本中所有弃用或破坏性更改的迁移指南,请参见破坏性更改页面。更新后运行 dart fix
将自动为您迁移其中的一些更改。
结论
Flutter 3.32 是我们在社区令人难以置信的奉献精神推动下的又一进步。我们非常兴奋地为大家带来了诸如 web 热重载和持续的平台改进等功能。您的贡献无比珍贵,我们迫不及待地想看看您会用它构建什么。如需全面了解,请查看详细的发行说明和更新日志。要开始使用,只需运行 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