深入了解Flutter3最新版本,包括macOS和Linux平台的稳定支持、多项性能改进等!

我想请教下,深入了解Flutter3最新版本,包括macOS和Linux平台的稳定支持、多项性能改进等!
最新回答
如梦如幻

2024-11-24 09:32:01

Flutter3实现了Flutter以移动端为中心扩展到多平台的产品规划,并在今年GoogleI/O大会的主题演讲上正式发布,继Flutter2.10支持Windows之后,此次发布提供了对macOS和Linux桌面端的稳定版支持,同时包括Firebase集成的改进,增加了与生产力和性能相关的新特性,并对Apple芯片提供了支持。

此版本中激动人心的升级包括:更新了Flutter对macOS和Linux的支持,性能得到了显著提升,针对移动设备和web端的更新,以及诸多其他功能!此外,我们还带来了关于减少对旧版Windows提供支持的消息,以及几条重大变更。下面让我们直奔主题吧!

全桌面平台生产就绪

Linux和macOS平台的支持已进入稳定状态,内含下列功能:

级联菜单和macOS系统菜单栏支持

现在您可以使用PlatformMenuBarwidget在macOS上创建平台渲染的菜单栏,支持插入仅限该平台使用的菜单,并控制macOS应用菜单中的显示内容。

△级联菜单示意

完整支持全桌面平台多国文本输入

全部三种桌面平台完整支持多国文本输入,包括使用文本输入法编辑器(IME)的语言,如中文、日文和韩文。同时支持第三方输入法,如搜狗(Sogou)、谷歌日文输入法(GoogleJapaneseInput)等。

全桌面平台无障碍服务

Flutter支持Windows、macOS和Linux平台的无障碍服务,包括屏幕文字阅读、无障碍导航和颜色反转等。

macOS平台默认使用通用二进制文件

在Flutter3中,FluttermacOS桌面应用会被构建为通用二进制文件,从而原生支持使用Intel处理器的Mac电脑和搭载AppleSilicon的新设备。

不再支持使用Windows7/8进行开发

此版本将建议的Windows开发版本提升为Windows10。虽然我们不会禁止使用旧版本(Windows7、Windows8、Windows8.1)进行开发,但由于Microsoft不再支持这些旧版本,我们仅会针对这些版本提供有限的测试。尽管我们会尽力为旧版本提供支持,但还是建议您升级版本。

注意:在Windows7和8上依然可以运行Flutter应用,此更改只影响我们推荐使用的开发环境。

移动端更新

我们针对移动端的更新包括:

支持可折叠设备

Flutter3支持可折叠移动设备。通过由Microsoft牵头的合作,让大家可以使用新的功能和widget在可折叠设备上创建动感、愉悦的体验。

作为合作的一部分,MediaQuery现在包含一个DisplayFeature列表,用以描述设备组件状态,包括铰链、折叠状态和屏幕刘海等。此外,DisplayFeatureSubScreenwidget包含的子widget的位置现在不会与DisplayFeature的边界重叠,并且已经用于框架的默认对话框和弹出窗口,使Flutter默认即可动态适应这些元素的位置。

非常感谢Microsoft团队。另外我们还要特别鸣谢@andreidiaconu所做出的贡献!

欢迎大家尝试SurfaceDuo模拟器示例,其中包含了FlutterGallery的一个特别派生版本,以便了解Flutter在双屏中的实际运行情况:

支持iOS可变刷新率

Flutter现已在使用ProMotion显示屏的iOS设备上支持可变刷新率,包括iPhone13Pro和iPadPro。在这些设备上Flutter应用的渲染刷新率可达120Hz,而之前最高为60Hz,这使得滚动等快速动画的观感体验更加流畅。请查看官方文档了解详情。

简化iOS发布

我们为Flutterbuildipa命令添加了新选项,使得iOS应用发布更加简便。在您准备好分发至TestFlight或AppStore时,请运行flutterbuildipa构建Xcode归档(.xcarchive文件)和应用软件包(.ipa文件)。您可选择添加--export-methodad-hoc、--export-methoddevelopment或--export-methodenterprise选项。应用软件包构建完成后,即可通过AppleTransportmacOS应用将其上传至Apple,或使用xcrunaltool在命令行中完成上传(运行manaltool获取AppStoreConnectAPI密钥验证说明)。上传完成后,您的应用即可发布至TestFlight或AppStore。在完成应用显示名称、应用图标等初始Xcode项目设置后,您在发布应用时就无需再打开Xcode了。

Gradle版本更新

使用Flutter工具创建新项目时,您或许已经注意到,生成的文件现在使用了最新版本的Gradle和AndroidGradle插件。对于现有的项目而言,您需要手动将Gradle版本升级至7.4,AndroidGradle插件版本升级至7.1.2。

停止更新32位iOS/iOS9/iOS10

按照2022年2月2.10稳定版发布的公告,Flutter对32位iOS设备以及iOS9和10的支持即将结束。这一变化会影响到iPhone4S、iPhone5、iPhone5C以及iPad第二、三、四代设备。Flutter3是最后一个支持上述iOS版本和设备的稳定版本。

如需详细了解此项变更,请参阅RFC:终止对32位iOS设备的支持。

Web端更新

我们针对web端的更新包括:

图像解码

在浏览器支持的情况下,Flutterweb现在可以自动检测并使用ImageDecoderAPI。到目前为止,大多数基于Chrome的浏览器都添加了此API,如Chrome、Edge、Opera、SamsungBrowser等。

这个新API使用浏览器内置的图像编解码器在主线程之外异步解码图像。这使得图像解码速度提高2倍,而且完全不会阻塞主线程,消除了所有之前由图像引起的卡顿现象。

Web应用的生命周期

Flutterweb应用的新生命周期API提升了灵活性,可实现从托管HTML页面控制Flutter应用的引导程序,并支持使用Lighthouse分析您的应用的性能表现。这适用于许多用例,包括以下常被开发者们提及的场景:

启动画面。

加载指示器。

在Flutter应用之前显示的纯HTML交互式加载页。

请阅读官方文档"自定义web应用初始化"了解详细信息。

工具更新

我们针对Flutter和Dart工装的更新内容包括:

Lintpackage更新

Lintpackage2.0版现已发布:

Flutter

Dart

使用fluttercreate生成的Flutter3应用将自动启用2.0版Lint套件。我们建议大家运行flutterpubupgrade--major-versionsflutter_lints,将现有应用、package和插件迁移到2.0版,以遵循Flutter最新、最优的最佳实践。

Lint2.0版中新增的大多数警告都带有自动修复功能。因此,当您在应用的pubspec.yaml中升级至最新package版本后,即可在代码库中运行dartfix--apply自动修复大多数Lint警告(某些警告仍需部分手动操作)。对于尚未使用package:flutter_lints的应用、package或插件,建议开发者按照迁移指南迁移至最新版本。

性能提升

感谢开源贡献者knopp,局部重绘已经在支持此功能的Android设备上实现。在我们的本地测试中,此功能在Pixel4XL设备上将依照backdrop_filter_perf基准测试的帧栅格化时间的平均值、90百分位值和99百分位值缩减了5倍。现在,iOS设备和较新版本的Android设备上都已实现在单一矩形脏区出现时进行局部重绘。

我们进一步提升了简单用例中不透明度动画的性能。具体而言,当Opacitywidget只包含单个渲染原语时,通常由Opacitywidget调用的saveLayer方法可以省略。在为此优化构建的基准测试中,此用例下的栅格化时间提升了一个数量级。在今后的版本中,我们计划为更多场景应用此优化。

在开源贡献者JsouLiang的努力下,引擎的光栅和界面线程在Android和iOS上的运行优先级已经高于其他线程(比如DartVM的后台垃圾回收线程)。在我们的基准测试中,这使得帧构建平均时间提速约20%。

在第3版发布之前,光栅缓存的准入策略只查看图片中绘制算子的数量(假设任何具有多个算子的图片都应该进入缓存)。但这会导致引擎消耗内存来缓存渲染速度极快的图片。此版本引入新的机制,根据所包含绘制算子的成本来估计图像渲染的复杂性。在我们的性能测试中,使用新机制作为栅格缓存准入策略可以减少内存用量,而不会降低性能。

感谢开源贡献者ColdPaleLight,他修复了iOS上由于帧调度bug而导致少量动画帧丢失的问题。感谢所有报告此问题并提供掉帧复现视频的每一个人。

Impeller

我们一直致力于解决iOS和其他平台上的早期卡顿问题。在Flutter3中,您可以在iOS上预览一个名为Impeller的实验性渲染后端。Impeller会在引擎构建时预编译一组较为小巧、简单的着色器,从而避免在应用运行时编译,而后者是造成Flutter卡顿的主要原因。Impeller尚未作好投产准备,距离完成也还有一段距离。目前Impeller尚未实现Flutter的所有功能特性,但我们对它在flutter/gallery应用中实现的保真度和性能感到满意,并且很高兴地在这里和大家分享开发进度。特别是,在Gallery应用的过场动画中,即便最差的帧速度也比之前快大约20倍。

Impeller可以带标记在iOS上使用。如果您要试用Impeller,可以传递--enable-impeller标记至flutterrun,或将Info.plist文件中的FLTEnableImpeller标记为true。Impeller的开发会继续在Flutter主渠道进行,我们希望在未来的版本中提供进一步更新。

Android上的内联广告

使用google_mobile_adspackage时,您应该可以感受到用户关键交互(如页面之间的滚动和切换)的性能有所提升。在新兴市场广为流行的设备上,这种性能提升尤其明显。最棒的是,您无需更改任何代码!

在具体实现方面,Flutter现在是异步组合Android视图(即通常所说的平台视图)。这意味着Flutter的光栅线程无需等待Android视图渲染。现在,Flutter引擎使用它管理的OpenGL纹理将视图显示在屏幕上。

更多令人兴奋的更新

我们针对Flutter生态系统的其他更新包括:

Material3

Flutter3支持新一代MaterialDesign,即MaterialDesign3。Flutter3提供Material3的可选支持,包括动态颜色、最新颜色系统和字体等MaterialYou功能,还包含许多组件的更新,以及在Android12中引入的新触摸波纹设计和拉伸滚动等全新视觉效果。我们欢迎大家通过全新的"将枯燥无味的Flutter应用变得生动有趣"的Codelab来尝试Material3的功能特性。请参阅API文档,详细了解如何选用上述新功能特性,以及哪些组件支持Material3。另请关注Material3Umbrellaissue了解最新开发进展。

主题扩展

借助"主题扩展(Themeextension)",Flutter现支持向Material库中的ThemeData添加任何内容。您现在可以指定ThemeData.extensions,而无需(在Dart中)扩展ThemeData并重新实现其copyWith、lerp和其他方法。另外,package开发者也可以提供ThemeExtension。请参阅官方文档了解详情,并查看GitHub上的相关示例。

广告

我们知道对于发布商来说,征求用户同意对个性化广告,以及应对Apple的"应用追踪透明度(AppTrackingTransparency,ATT)"要求非常重要。

为了支持这些需求,Google提供了"用户消息平台(UserMessagingPlatform,UMP)"SDK,取代了之前的开源ConsentSDK。在即将发布的Google移动广告SDK(Flutter)中,我们会增加对UMP(用户消息平台)SDK的支持,让发布商能够征求用户同意。如需了解详情,请在pub.dev上查看google_mobile_adspackage页面。

重大变更

在持续扩展和改进Flutter的过程中,我们会尽量把重大变更的数量维持在最低限度。Flutter3包含以下重大变更:

2.10版之后移除已弃用的API

页面切换转为使用ZoomPageTransitionsBuilder

Chips的useDeleteButtonTooltip迁移至deleteButtonTooltipMessage

如果您正在使用上述API,请参阅Flutter.dev上的迁移指南。

总结

按照Statista和SlashData等分析机构的统计,Flutter依然是最受欢迎的跨平台界面工具包,我们能保持这种地位,社区的贡献功不可没,对此,GoogleFlutter团队向大家致以由衷敬意。期待与各位社区成员共同努力,继续提供由社区驱动的工具,帮助大家为用户创造出更多令人愉悦的体验!

最后

Flutter精彩课程推荐

Flutter高级进阶实战仿哔哩哔哩APP

Flutter从入门到进阶实战携程网App

原文:https://juejin.cn/post/7103147666644828168