2天前,Flutter发布了最新版本3.32,我们来一起看下29到32有哪些变化。
简介
欢迎来到Flutter 3.32!此版本包含了旨在加速开发和增强应用程序的功能。准备好在网络上进行热加载,令人惊叹的原生保真Cupertino,以及与Firebase强大的新AI集成。156位独特贡献者提交了1024次提交,其中包括39位首次贡献者,Flutter 3.32证明了我们社区令人难以置信的工作。让我们一起探索新事物吧!
Web
Web上的热重载 (Beta)
我们很高兴地宣布,你现在可以在Web上热加载!Web对热加载的支持是在Flutter跟踪器上投票最多的第二大问题。我们很高兴能给你一个机会在你自己的项目中试用它!我们需要您的帮助,以确保这个令人兴奋的新功能有开发人员想要的一切。
如果您发现任何问题,使用Dart的Web Hot Reload问题模板提交错误。你可以在Web Hot Reload known issues GitHub项目上找到已知问题的列表。
现在是有趣的部分:如何使用这个功能
我们添加了一个简单的命令行标志--web-experimental-hot-reload,你可以在任何地方调用flutter run。
使用VS Code 运行
如果您在VSCode 中使用调试配置,您可以添加这一项内容。
将配置添加到您的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 中Reloading
现在,DartPad上也支持热重载功能,新增了一个“Reload”按钮。该功能仅在运行的应用程序中检测到 Flutter时才可用。您可以使用 DartPad 提供的示例应用程序来试用此功能。
感谢您抽出时间帮助我们让网络上的“热重载”功能变得如此出色!
Framework(架构)
我们一直在努力将逻辑从Material library转移到 widgets library中。
此次更新引入了一款名为“可扩展”(Expansible)的新控件,它使得创建具有不同视觉主题的可展开和收缩的控件变得更加简便。这款新控件是Material-styled的ExpansionTile底层构建模块。
此次更新中还有一个非常有价值的新增功能RawMenuAnchor,由社区成员@davidhicks980 提供。这个小部件现已成为基础构建模块的Material-styled MenuAnchor,为创建具有不同视觉主题的菜单铺平了道路。此外,RawMenuAnchor 也可以独立使用,作为未加修饰的菜单,让您完全掌控其外观。
这样的重构为诸如 Cupertino和 Material等设计语言的实现提供了更好的核心组件支持,同时还能实现更一致的界面设计和代码复用。
Cupertino
Squircles(圆角:方圆形)
我们很高兴向大家介绍 Flutter 中形状功能的一项重大新改进:圆弧超椭圆(rounded superellipse)。
这种形状常被称为“Apple squircle(苹果椭圆形)”,它是iOS设计语言的重要组成部分,因其曲线更加平滑且连贯,而不同于传统的圆角矩形。Flutter 社区经常提出支持这种形状的需求。它的加入代表了我们在为苹果平台提供具有原生外观和感觉的高质量用户界面方面所做出的又一努力。
CupertinoAlertDialog和 CupertinoActionSheet 两者均已更新,采用了这种新的形状!
您可以使用这些新的API 来为您的应用程序添加圆润的超椭圆图形:
- 用于绘画或作为控件形状使用的RoundedSuperellipseBorder
- 用于裁剪的 ClipRSuperellipse。
- Canvas.drawRSuperellipse、 Canvas.clipRSuperellipse 以及Path.addRSuperellipse 是针对底层API 的实现,它们提供了更直接的控制方式。
请注意,这种圆润的超椭圆形状仍在开发中。目前,它仅在iOS和Android 系统上可用,否则其表现将恢复为标准的圆角矩形。性能优化工作也在进行中。我们鼓励您在考虑这些因素的情况下探索这一新功能,并期待在未来更新中提升其功能!
Sheet
Cupertino Sheet也解决了几个问题,包括在Android上打开工作表时如何设置系统UI主题。
调整Sheet以固定导航条的高度,并确保内容不会在底部被切断。下面的屏幕截图演示了更改之前和之后的情况。
此版本中的其他修复包括工作表过渡与PopupMenuButton不兼容的问题,以及工作表的圆角过渡在更多设备上看起来正确。以前,它在一些具有不同角半径的屏幕上看起来不正确。
你现在也可以在CupertinoSheetRoute和showCupertinoSheet上使用新的enableDrag参数来禁用Cupertino底部工作表的下拉解除行为。(#163923)
Navigation bars
CupertinoSliverNavigationBar.search。在打开或关闭搜索视图时,搜索可以看到其动画的保真度改进,以及搜索字段的前缀和后缀图标的正确对齐。
https://miro.medium.com/v2/resize:fit:720/format:webp/0*R1tsiciz-w7OdOjr最后,带有 CupertinoNavigationBars 或 CupertinoSliverNavigationBars 的页面之间的切换已更新,以与最新的iOS 切换效果保持一致(#164956)。
Material
此次更新为Material库带来了多项功能增强和错误修复,从而提升了其功能性和开发者的使用体验。
这些功能改进包括:
- CarouselController提供了更便捷的animateToIndex功能方法使得轮播图能够实现流畅的、基于索引的导航操作。
无论是使用固定大小的项目还是动态大小的项目,都可以通过flexWeights来进行设置。
- TabBar 现在具备了 onHover和 onFocusChange回调功能,这能让您获得更多操作选项。对小部件在不同状态下的外观进行控制。
- SearchAnchor 和 SearchAnchor.bar 现在分别包含了 viewOnOpen 和onOpen 回调函数,这使得能够更好地观察和处理打开/关闭事件。
- CalendarDatePicker现在支持设置一个calendarDelegate对象,以便能够实现对格里高利历系统之外的自定义日历逻辑的集成。示例展示了这样一个假设的日历系统:偶数月份有21天,奇数月份有28天,并且每个月都从星期一开始,这展示了该委托对象所提供的灵活性。
其他一些小的改进包括:为 showDialog、showAdaptiveDialog 和 DialogRoute 添加了 animationStyle 属性,以便在对话框打开和关闭时自定义动画效果;Divider现在支持设置 borderRadius 属性,从而能够自定义分隔线的边框,尤其是在分隔线较粗的情况下。
除了新增的功能之外,此次更新还解决了材料库中DropdownMenu和Slider相关的若干bug问题:
- DropdownMenu 控件现在允许其菜单的宽度小于文本字段的宽度。示例已更新以解决之前出现的RenderFlex溢出错误。DropdownMenu的默认宽度现在会根据文本字段中的文本标签的宽度进行调整。
- 当鼠标悬停在RangeSlider的指针上时,仅会显示被悬停指针所覆盖的部分。此前,两个指针的覆盖部分都会错误地显示出来。现在,当轨道颜色透明时,Slider指针可以到达轨道的两端,这解决了之前的一个限制,即它无法做到这一点。
无障碍
优化后的语义树编译
此功能将语义编译时间缩短了约80%。在 Flutterfor web 中,启用语义功能后,这相当于将帧时间缩短了30%。
介绍精细粒度的语义角色
一个新的SemanticsRoleAPI已被整合到Semantics控件及其相关组件中,为开发者提供了更精确地控制用户辅助技术如何解读用户界面元素的能力。这一改进使得只需将整个控件树包裹在已配置为特定语义的Semantics控件中,即可为其指定特定的语义角色。
官方的API 文档中详细列出了可用的角色列表。目前,这种高级语义角色功能仅适用于基于网络的应用程序,而其他平台的支持将在未来的版本中推出。
了解更多信息,请参阅《通过语义角色提升可访问性》。
其他无障碍设施的改进措能
- 增强的用户界面体验与屏幕阅读器支持:在各种小部件(包括文本字段、焦点处理、菜单、滑块和下拉列表等)中提供了更出色的可访问性和用户体验。舜幕阅读器现在在用户与这些元素进行交互时能提供更详细的反饭。
- ’借助语义技术实现更流畅的网页焦点导航:当启用源义功能时,网页焦点行为将得到优化,从而是著减少不同组件之间突然的焦点晓转,为用户提供更直观的导航体验。
- 改进了 Android TalkBack 的链接识别功能:Android TalkBack 现在能够正确识别并播报使用语义定义的链接。包括使用 Semantics.linkUrl或url_launcher包中的Link组件所定义的链接。
-
在 Flutter 中为网页添加 Windows 高对比度模式支持:引入了对Windows的“强制颜色”模式的支持(常用于高对比度场景)。开发者现在可以在ThemeData 中设置 useSystemColors 布尔值,以便自动将系统颜色应用到
Flutter 主題中,从而为依赖这些设置的用户提高可见性。 - 优化的iOS 语音控制体验:通过确保不可操作的小组件不再显示不必要的标签,提升了iOS 语音控制的用户体验,使用户的操作更加简洁、专注。
文本输入
此次更新中,文本输入功能有了多项改进:
- 在iOS 系统中启动了系统文本选择上下文菜单,相关内容请见下文的iOS部分。
- Autocomplete控件的选项布局已被移植到OverlayPortal中,这不仅提高了性能,还解决了布局方面的缺陷。
- 现在可以对文本字段中的onTapUpOutside行为进行自定义了(#162575)。
- 现在,开发人员可以为FormField生成任何他们想要的自定义控件作为错误消息,而不再只是简单的错误文本(#162255)。
- 在Flutter 中,可选文本的bug问题有所減少 (#162228),并且在网页端的性能也有所提升 (#161682)。
多窗口支持方面的进展
来自 Canonical 公司的开发人员在实现桌面应用程序支持多窗口功能方面取得了显著进展
Canonical 已修复了在应用程序存在多个窗口时出现的若干故障问题:
- 可访问性:#164577
- 应用生命周期通知:#164872
- 重点:#164296
- 键盘事件: #162131, #163962
- 文本输入:#163847, #164014
- 鼠标事件:#163855
Canonical 还新增了一项功能,使得 Dart 代码的 FFI (Foreign Function Interface,即外部函数接口)能够直接与 Flutter 引擎进行通信 (#163430)。这 Flutter 未来的窗口API 构建奠定了基础。
最后,Canonical 在 Linux 系统中引入了raster thread (#161879)。这提高了帧的传输速度,确保了即使您打开了多个窗口,Flutter 在 Linux 系统中的运行依然流畅顺滑。
桌面线程合并
Canonical 还对Windows 和 macOS 系统进行了更折,使得应用能够將 UI和平台线程合井起来(相关问題編号:#162883, #162935)。
合并线程使您能多使用 Dart FFI 与必须在平台线理上调用的原生AP1进行交互。例如,如果在 Windows 上点用了合并线猩,您就可以使用 Dart FFl 通过 win32 API 适配开发
在 Windows系總中,您可以造过在 windows/runner/main.cpp文件中的wwinMain”方法内添加以下代来启用合井线程:
project.set_ui_thread_policy(UIThreadPolicy::RunOnPlatformThread)
在 macOS 系統中,您可以通过在macos/Runnes/info.plist 文件中的<dict>元素内添加以下内容来启用合并线程:
<key>FLTEnableMergedPlatformUIThread</key>
<true />
在来来的版本中,我们将在 Windows和 macOS 系统上默认开启合并线釋功能,请尝试一下,并在遇到任何问题时提交相关 bug 报告!
ios
我们在iOS 平台上对 Flutter 应用程序的粘贴功能进行了优化!对于那些没有自定义操作的基本文本字段,用户在从其他应用程序粘贴内容时将不再看到确认对话框。此功能在所有FlutterioS 应用程序中默认已启用。请注意,如果您的应用程序使用了自定义操作(例如:在菜单中“发送电子邮件”)此功能目前尚不支持。
Android
对 Gradle 工具进行的 Kotlin 语言重写
Flutter 的Gradle 插件已从 Groovy语言转换为 Kotlin语言。这一从 Groovy 到Kotlin 的转变使得代码库更易于进行贡献,并且也有助于为该插件引入单元测试。新增的测试以及从动态类型和动态执行的语言转换为静态类型语言,应该会为Flutter开发者带来更稳定和可靠的构建过程。我们不期望此次重写会导致任何行为上的变化,所以如果您发现 Android 构建与预期不符,请提交一个问题。
书写板/触控笔支持
现在,您可以用触控笔在安卓设备上的文本字段中进行书写,其方式与苹果手写笔在 FlutterioS 应用中的手写输入功能相同。用户可以直接在任何 Flutter文本输入字段上开始书写,手写内容将会以文本形式显示在该字段中。目前并非所有手势都得到支持,但我们正在努力填补这些空白。此功能仅在 Android 14及以上版本中可用,并且如果需要,可以通过 TextField.stylusHandwritingEnabled或CupertinoTextField.stylusHandwritingEnabled
设置。
Engine
安卓系统上的Impeller
从 3.29.3版本开始,在运行 Android API级别为28(即 Android 9)及更低版本的设备上,Flutter 应用将使用传统的 Skia 渲染器。这一改变提高了 Flutter 在较旧日的Android设备上的稳定性。而Impeller 则继续作为运行 API级别为29(即 Android10)及更高版本设备的默认渲染器。
随着我们从使用不同设备的用户那里获得更多的反馈,我们已经调整了哪些设备使用
Impeller 的 Vulkan 后端,而哪些设备使用 OpenGLES 后端。特别地,在此次更新中,以下设备将使用 OpenGLES 而非 Vulkan:Android 模拟器、API版本小于31的联发科技设备、CXT 之前的 PowerVR 设备,以及不支持 Vulkan 1.3的三星 XClipse GPU的较旧版本。
与之前的版本一样,您可以通过以下步骤选择退出使用Impeller。鉴于我们对Impeller稳定性和性能的愈发信任,未来的一个稳定版本中,将不再提供在新款安卓设备上退出使用Impeller的选项。
最后,Flutter 3.27版本存在一些与在支持Vulkan的设备上使用Impeller 渲染相关的渲染错误和崩溃问题,这些问题在 3.29及更高版本中已得到解决。我们不打算将这些更改直接应用于3.27版本,强烈建议您升级到3.29或更高版本。如果您的应用程序无法进行升级,我们建议在安卓设备上禁用Impeller 功能。
其他Impeller更新
此次更新提升了Impeller的文本渲染效果。尤为值得一提的是,得益于Impeller字体图集中的更高分辦率字体,文本动画变得更加流畅,抖动现象也明显减少,并且还解决了浮点运算中的四舍五入误差问题。更多详情请参见 flutter#149652.
此次发布还包含了多种其他音质和性能方面的内容。
改进措施,包括:
- 圆锥曲线不再进行近似处理,而是直接进行分块分割。
- 部分重绘已得到优化,以避免频繁进行内存分配。
- 模糊效果的处理速度得到了提升,这是因为去除了不必要的附加组件。
- 文本的固定方向已精确旋转了180度。
DevTools and IDEs
[新功能]Flutter属性编辑器
可以轻松编辑小部件属性,并通过新的“属性编辑器”工具阅读相关文档。该工具可通过 Flutter 属性编辑器侧边栏面板(在VS Code 中)或工具窗口(在 AndroidStudio 或IntelliJ中)访问。
DevTools改进
在 DevTools 中还进行了多项改进,包括为网络界面新增了离线支持功能、修复了与审查历史、检查器错误、深度链接工具以及 CPU分析器和内存界面的数据相关的问题,并对数据进行了优化。此次更新还为DevTools 增加了多项性能和内存方面的改进,这将使数据加载速度更快,减少与内存相关的崩溃情况。
这只是此次发布的一些重点内容。如需了解 Flutter3.32中包含的所有更新内容,请查阅 DevTools 的发布说明2.44.0和2.45.0。
Analyzer改进
我们一直在对Dart分析器进行改进,从而优化了开发者的使用体验。这包括新增了“文档导入”功能,这是一种基于注释的语法,使得在文档注释中能够引用外部元素,而无需实际进行导入操作。详情请查看dart.dev。此外,我们还对快速修复、辅助功能和重命名功能进行了多项改进。
在 Android Studio 中,Gemini 现在能够流畅地使用 Flutter和 Dart 语言了。
在Android Studio 中,Gemini 现已为 Dart 和 Flutter 开发提供了顶级支持!这意味着您可以在您所喜爱的集成开发环境(IDE)中直接利用Gemini 的强大功能,从而以比以往更快、更简便的方式构建美观且高性能的 Flutter 应用程序。
博客链接:博客链接
https://miro.medium.com/v2/resize:fit:720/format:webp/1*51UZbL3Qb7BGDEuujTTg6A.gif
对于模型上下文协议 (MCP)的支持,Dart 和 Flutter 已经即将推出。
对于模型上下文协议(MCP)以及近期发布的Dart MCP SDK的支持工作正在积极推进中。同时,一个新的 Dart Tooling MCP Server也正在开发中,该服务器将向MCP 客户端(如集成开发环境)开放Dart 和 Flutter 的静态、运行时以及生态系统工具功能。
这将为 Dart和 Flutter 开发者带来以下好处:
- 更准确且更具针对性的代码生成。
- 复杂的任务—一比如解决布局问题、管理依赖关系,甚至解决运行时错误一一都变得可行了,这是因为MCP 协议能够从实际的 Dart和 Flutter 工具中获取语义信息。
敬请关注!
Build with AI
介绍 Firebase Al逻辑
您可能听说过,或者甚至已经在 Firebase 中使用过 Vertex Al。Firebase 是我们为将Gemini API驱动的功能直接集成到您的 Flutter 应用程序中而开发的客户端SDK。
许多用户要求使用“Gemini Developer API”而非 “Vertex A”,以便利用丰厚的免费套餐,并以零成本开始添加生成式人工智能功能。我们听到了你们的诉求!从今天起,我们将
Vertex Al 在 Firebase 中进行升级,将其转变为 Firebase AI 逻辑,这样只需一个 FlutterSDK就能访问到Gemini API 的两个提供者。这使得您能够直接从 Flutter 应用程序中使用Gemini 和“Imagen” 模型,而无需使用服务器端SDK。
请查看 firebase_ai 包以了解新功能。如果您已经在使用 firebase_vertexai包,那么目前它仍能保持原样运行,但我们鼓励您迁移到新的包版本。
借助 AI 监控仪表盘获取可操作的见解
Firebase 控制台中的新 AI 监控仪表板能够为您提供有关 Gemini API 使用情况的详细且具有实际意义的洞察。这包括对使用模式、性能指标以及潜在问题的全面了解。这有助于您做出基于数据的决策,并确保您以最高效的方式使用 Gemini APl。AI 监控还能帮助您调试 GeminiAPI的使用情况,并识别和解决任何意外行为。
打破变更和弃用
安卓无障碍功能公告
在安卓系统中,自API 36版本起,语义公告事件已被弃用。相反,可以通过配置 SemanticProperties.liveRegion 来使用“polite”的隐式通知,目前,在宣布不应具有焦点的文本时存在一个已知的限制。有关此限制的详组估息以及解决此问题的计划,请参阅问题 #165857 。要查看其他解决方案,请查阅关于SemanticService.announce ,
停止对6个软件包的支持
正如我们在 Flutter 3.29版本发布博客文章中所计划和阅述的那样,我们已停止对以下包的支持:
flutter_markdown
; see flutter_markdown planned to be discontinued #162966ios_platform_images
; see ios_platform_images planned to be discontinued #162961css_colors
; see css_colors planned to be discontinued #162962palette_generator
; see palette_generator planned to be discontinued #162963flutter_image
; see flutter_image discontinued #162964flutter_adaptive_scaffold
; see flutter_adaptive_scaffold planned to be discontinued #162965
我们鼓助社区成员参考每个议题中的讨论内容,以获取其他可行的解决方案。
iOS和 macOS的最低版本要求
在下一次稳定版本发布中,Flutter 将停止对iOS12和 macos 10.14(莫卡维)的支持,并将把最低运行要求设定为iOS 13和 macOS 10.15(塔卡琳)。这意味着基于未来版本的Flutter 构建的应用程序将无法在iOS 12或 macOS 10.14上运行。
其他重大变更
本次更新中还有其他一些重大变更和弃用内容包括:
- 在 Material 中,已弃用 “ExpansionTileController”组伴,转而采用位于 Widgets层中的新的可复用 “ExpansibleController”组件。
- 将 “SelectionChangedCause.scribble”(已弃用)重命名为“
SelectionChangedCause.stylusHandwriting”,因为苹果的“绘图”功能现已与安卓的“书写板”功能统一了。 - 作为我们持缓推进材料主题化标准化工作的一部分,ThemeDatarindicatorColor 已被弃用,取而代之的是TabBarThemeData.indicatorColor。同时,cardTheme、dialogTheme 和 tabBarTheme 的组件主题类型需要分别迁移到CardThemeData. DialogThemeData ,TabBarThemeData 。
- 在某些行为中,SpringDescription 的公式已得到修正。这一改动解决了这样一个问题:对于某些参数组合,该行为与预期的真实物理现象不符,并且在临界阻尼点附近会出现不连续现象。这种破坏性影响到欠阻尼弹簧(阴尼比小于1) 以及质量值并非1的其他情况。在此更改之前创建的此类弹簧在升级后可能会表现出不同的弹跳行为。要恢复之前的动画行为,请根据“欠阻尼弹簧的破坏性更改说明”更新您的弹簧参数,您还可以在该指南中找到用于计算参数调整的工具。
要查看本版本中所有已弃用功能或重大变更的迁移指南,请访问“重大变更”页面。更新后运行 “dart fix”命令将自动为您迁移部分此类变更。
结论
Flutter 3.32 进一步实现了突破,这得益于我们社区的不懈努力。我们非常高兴能为您带来诸如网页热重载等新功能以及持续的平台改进。您的贡献至关重要,我们迫不及待地想看到您所创造的成果。如需全面了解详情,请查看详细的发行说明和变更日志。要开始使用,请直接运行 “flutter upgrade”并进入最新版本!