一起看 I/O | Flutter 3 更新详解
作者 / Kevin Jamaul Chisholm, Technical Program Manager for Dart and Flutter at Google
又到了 Flutter 稳定版发布时间,我们无比自豪地宣布推出 Flutter 3 !仅 3 个月前,我们宣布了 Flutter 对 Windows 的支持。现在,我们再次怀着激动的心情宣布,继 Windows 之后,Flutter 现已稳定支持 macOS 和 Linux!
我们总计合并了 5,248 条 PR,感谢各位 Flutter 贡献者的辛勤工作!
此版本中激动人心的升级包括: 更新了 Flutter 对 macOS 和 Linux 的支持,性能得到了显著提升,针对移动设备和 web 端的更新,以及诸多其他功能!此外,我们还带来了关于减少对旧版 Windows 提供支持的消息,以及几条重大变更。下面让我们直奔主题吧!
全桌面平台生产就绪
Linux 和 macOS 平台的支持已进入稳定状态,内含下列功能:
级联菜单和 macOS 系统菜单栏支持
现在您可以使用 PlatformMenuBar
widget 在 macOS 上创建平台渲染的菜单栏,支持插入仅限该平台使用的菜单,并控制 macOS 应用菜单中的显示内容。
完整支持全桌面平台多国文本输入
全部三种桌面平台完整支持多国文本输入,包括使用文本 输入法编辑器[1] (IME) 的语言,如中文、日文和韩文。同时支持第三方输入法,如搜狗 (Sogou)、谷歌日文输入法 (Google Japanese Input) 等。
全桌面平台无障碍服务
Flutter 支持 Windows、macOS 和 Linux 平台的无障碍服务,包括屏幕文字阅读、无障碍导航和颜色反转等。
macOS 平台默认使用通用二进制文件
在 Flutter 3 中,Flutter macOS 桌面应用会被构建为通用二进制文件,从而原生支持使用 Intel 处理器的 Mac 电脑和搭载 Apple Silicon 的新设备。
不再支持使用 Windows 7/8 进行开发
此版本将建议的 Windows 开发版本提升为 Windows 10。虽然我们不会禁止使用旧版本 (Windows 7、Windows 8、Windows 8.1) 进行开发,但由于 Microsoft 不再支持这些旧版本[2],我们仅会针对这些版本提供有限的测试。尽管我们会尽力为旧版本提供支持,但还是建议您升级版本。
注意: 在 Windows 7 和 8 上依然可以运行 Flutter 应用,此更改只影响我们推荐使用的开发环境。
移动端更新
我们针对移动端的更新包括:
支持可折叠设备
Flutter 3 支持可折叠移动设备。通过由 Microsoft 牵头的合作,让大家可以使用新的功能和 widget 在可折叠设备上创建动感、愉悦的体验。
作为合作的一部分,MediaQuery[3] 现在包含一个 DisplayFeature[4] 列表,用以描述设备组件状态,包括铰链、折叠状态和屏幕刘海等。此外,DisplayFeatureSubScreen[5] widget 包含的子 widget 的位置现在不会与 DisplayFeature
的边界重叠,并且已经用于框架的默认对话框和弹出窗口,使 Flutter 默认即可动态适应这些元素的位置。
非常感谢 Microsoft 团队。另外我们还要特别鸣谢 @andreidiaconu[6] 所做出的贡献!
欢迎大家尝试 Surface Duo 模拟器示例[7],其中包含了 Flutter Gallery 的一个特别派生版本,以便了解 Flutter 在双屏中的实际运行情况:
支持 iOS 可变刷新率
Flutter 现已在使用 ProMotion 显示屏的 iOS 设备上支持可变刷新率,包括 iPhone 13 Pro 和 iPad Pro。在这些设备上 Flutter 应用的渲染刷新率可达 120 Hz,而之前最高为 60 Hz,这使得滚动等快速动画的观感体验更加流畅。请查看 [官方文档](https://docs.google.com/document/d/1O-ot6MydAl5pAr_XGnpR-Qq5A5CPDF6edaPu8xQtgCQ/edit?resourcekey=0-LlXeGtGRC67XL4NrGoc91A "在Flutter (iOS "官方文档")中增加了对可变刷新率显示的支持") 了解详情。
简化 iOS 发布
我们为 flutter build ipa
命令添加了 新选项[8],使得 iOS 应用发布更加简便。在您准备好分发至 TestFlight 或 App Store 时,请运行 flutter build ipa 构建 Xcode 归档 (.xcarchive 文件) 和应用软件包 (.ipa 文件)。您可选择添加 --export-method ad-hoc、--export-method development 或 --export-method enterprise 选项。应用软件包构建完成后,即可通过 Apple Transport macOS 应用[9] 将其上传至 Apple,或使用 xcrun altool 在命令行中完成上传 (运行 man altool 获取 App Store Connect API 密钥验证说明)。上传完成后,您的应用即可发布至 TestFlight 或 App Store[10]。在完成应用显示名称、应用图标等初始 Xcode 项目设置[11] 后,您在发布应用时就无需再打开 Xcode 了。
Gradle 版本更新
使用 Flutter 工具创建新项目时,您或许已经注意到,生成的文件现在使用了最新版本的 Gradle 和 Android Gradle 插件。对于现有的项目而言,您需要手动将 Gradle 版本升级至 7.4,Android Gradle 插件版本升级至 7.1.2。
停止更新 32 位 iOS/iOS 9/iOS 10
按照 2022 年 2 月 2.10 稳定版发布的公告,Flutter 对 32 位 iOS 设备以及 iOS 9 和 10 的支持即将结束。这一变化会影响到 iPhone 4S、iPhone 5、iPhone 5C 以及 iPad 第二、三、四代设备。Flutter 3 是最后一个支持上述 iOS 版本和设备的稳定版本。
如需详细了解此项变更,请参阅 RFC: 终止对 32 位 iOS 设备的支持[12]。
Web 端更新
我们针对 web 端的更新包括:
图像解码
在浏览器支持的情况下,Flutter web 现在可以自动检测并使用 ImageDecoder API。到目前为止,大多数基于 Chrome 的浏览器都添加了此 API,如 Chrome、Edge、Opera、Samsung Browser 等。
这个新 API 使用浏览器内置的图像编解码器在主线程之外异步解码图像。这使得图像解码速度提高 2 倍,而且完全不会阻塞主线程,消除了所有之前由图像引起的卡顿现象。
Web 应用的生命周期
Flutter web 应用的新生命周期 API 提升了灵活性,可实现从托管 HTML 页面控制 Flutter 应用的引导程序,并支持使用 Lighthouse 分析您的应用的性能表现。这适用于许多用例,包括以下常被开发者们提及的场景:
启动画面。
加载指示器。
在 Flutter 应用之前显示的纯 HTML 交互式加载页。
请阅读官方文档 "自定义 web 应用初始化[13]" 了解详细信息。
工具更新
我们针对 Flutter 和 Dart 工装的更新内容包括:
Lint package 更新
Lint package 2.0 版现已发布:
Flutter[14]
Dart[15]
使用 flutter create
生成的 Flutter 3 应用将自动启用 2.0 版 Lint 套件。我们建议大家运行 flutter pub upgrade --major-versions flutter_lints
,将现有应用、package 和插件迁移到 2.0 版,以遵循 Flutter 最新、最优的最佳实践。
Lint 2.0 版中新增的大多数警告都带有自动修复功能。因此,当您在应用的 pubspec.yaml
中升级至最新 package 版本后,即可在代码库中运行 dart fix --apply
自动修复大多数 Lint 警告 (某些警告仍需部分手动操作)。对于尚未使用 package:flutter_lints
的应用、package 或插件,建议开发者按照 迁移指南[16] 迁移至最新版本。
性能提升
感谢开源贡献者 knopp[17],局部重绘已经在支持此功能的 Android 设备上实现[18]。在我们的本地测试中,此功能在 Pixel 4XL 设备上将依照 backdrop_filter_perf
基准测试的帧栅格化时间的平均值、90 百分位值和 99 百分位值缩减了 5 倍。现在,iOS 设备和较新版本的 Android 设备上都已实现在单一矩形脏区出现时进行局部重绘。
我们 进一步提升[19] 了简单用例中不透明度动画的性能。具体而言,当 Opacity
widget 只包含单个渲染原语时,通常由 Opacity
widget 调用的 saveLayer
方法可以省略。在为此优化构建的基准测试中,此用例下的栅格化时间提升了 一个数量级[20]。在今后的版本中,我们计划为更多场景应用此优化。
在开源贡献者 JsouLiang[21] 的努力下,引擎的光栅和界面线程在 Android 和 iOS 上的运行优先级已经高于其他线程 (比如 Dart VM 的后台垃圾回收线程)。在我们的基准测试中,这使得帧构建平均时间提速 约 20%[22]。
在第 3 版发布之前,光栅缓存的准入策略只查看图片中绘制算子的数量 (假设任何具有多个算子的图片都应该进入缓存)。但这会导致引擎消耗内存来缓存渲染速度极快的图片。此版本 引入新的光栅缓存机制[23],根据所包含绘制算子的成本来估计图像渲染的复杂性。在我们的性能测试中,使用新机制作为栅格缓存准入策略可以 减少内存用量[24],而不会降低性能。
感谢开源贡献者 ColdPaleLight[25],他修复了 iOS 上由于 帧调度 bug[26] 而导致少量动画帧丢失的问题。感谢所有报告此问题并提供掉帧复现视频的每一个人。
Impeller
我们一直致力于解决 iOS 和其他平台上的早期卡顿问题。在 Flutter 3 中,您可以在 iOS 上预览一个名为 Impeller[27] 的实验性渲染后端。Impeller 会在引擎构建时预编译一组 较为小巧、简单的着色器[28],从而避免在应用运行时编译,而后者是造成 Flutter 卡顿的主要原因。Impeller 尚未作好投产准备,距离完成也还有一段距离。目前 Impeller 尚未实现 Flutter 的所有功能特性,但我们对它在 flutter/gallery[29] 应用中实现的保真度和性能感到满意,并且很高兴地在这里和大家分享开发进度。特别是,在 Gallery 应用的过场动画中,即便最差的帧速度也比之前快大约 20 倍[30]。
Impeller 可以带标记在 iOS 上使用。如果您要试用 Impeller,可以传递 --enable-impeller
标记至 flutter run
,或将 Info.plist
文件中的 FLTEnableImpeller
标记为 true
。Impeller 的开发会继续在 Flutter 主渠道进行,我们希望在未来的版本中提供进一步更新。
Android 上的内联广 告
使用 google_mobile_ads[31] package 时,您应该可以感受到用户关键交互 (如页面之间的滚动和切换) 的性能有所提升。在新兴市场广为流行的设备上,这种性能提升尤其明显。最棒的是,您无需更改任何代码!
在具体实现方面,Flutter 现在是异步组合 Android 视图 (即通常所说的 平台视图[32])。这意味着 Flutter 的光栅线程无需等待 Android 视图渲染。现在,Flutter 引擎使用它管理的 OpenGL 纹理将视图显示在屏幕上。
更多令人兴奋的更新
我们针对 Flutter 生态系统的其他更新包括:
Material 3
Flutter 3 支持新一代 Material Design,即 Material Design 3[33]。Flutter 3 提供 Material 3 的可选支持,包括动态颜色、最新颜色系统和字体等 Material You 功能,还包含许多组件的更新,以及在 Android 12 中引入的新触摸波纹设计和拉伸滚动等全新视觉效果。我们欢迎大家通过全新的 "将枯燥无味的 Flutter 应用变得生动有趣[34]" 的 Codelab 来尝试 Material 3 的功能特性。请参阅 API 文档[35],详细了解如何选用上述新功能特性,以及哪些组件支持 Material 3。另请关注 Material 3 Umbrella issue[36] 了解最新开发进展。
主题扩展
借助 "主题扩展 (Theme extension)",Flutter 现支持向 Material 库中的 ThemeData
添加任何内容。您现在可以指定 ThemeData.extensions
,而无需 (在 Dart 中) 扩展 ThemeData
并重新实现其 copyWith
、lerp
和其他方法。另外,package 开发者也可以提供 ThemeExtension
。请参阅 官方文档[37] 了解详情,并查看 GitHub 上的 相关示例[38]。
广告
我们知道对于发布商来说,征求用户同意对个性化广告,以及应对 Apple 的 "应用追踪透明度 (App Tracking Transparency, ATT)" 要求非常重要。
为了支持这些需求,Google 提供了 "用户消息平台 (User Messaging Platform, UMP)" SDK,取代了之前的开源 Consent SDK[39]。在即将发布的 Google 移动广告 SDK (Flutter) 中,我们会增加对 UMP (用户消息平台) SDK 的支持,让发布商能够征求用户同意。如需了解详情,请在 pub.dev 上查看 google_mobile_ads[40] package 页面。
重大变更
在持续扩展和改进 Flutter 的过程中,我们会尽量把重大变更的数量维持在最低限度。Flutter 3 包含以下重大变更:
2.10 版之后移除已弃用的 API[41]
页面切换转为使用 ZoomPageTransitionsBuilder[42]
Chips 的 useDeleteButtonTooltip 迁移至 deleteButtonTooltipMessage[43]
如果您正在使用上述 API,请参阅 Flutter.dev 上的 迁移指南[44]。
总结
按照 Statista 和 SlashData 等分析机构的统计,Flutter 依然是最受欢迎的跨平台界面工具包,我们能保持这种地位,社区的贡献功不可没,对此,Google Flutter 团队向大家致以由衷敬意。期待与各位社区成员共同努力,继续提供由社区驱动的工具,帮助大家为用户创造出更多令人愉悦的体验!
文内链接
[1]
输入法编辑器: https://baike.baidu.com/item/%E8%BE%93%E5%85%A5%E6%B3%95%E7%BC%96%E8%BE%91%E5%99%A8/8970940
[2]
Windows 生命周期常见问题解答: https://docs.microsoft.com/en-us/lifecycle/faq/windows
[3]
MediaQuery API 文档: https://api.flutter-io.cn/flutter/widgets/MediaQuery-class.html
[4]
DisplayFeature API 文档: https://api.flutter-io.cn/flutter/dart-ui/DisplayFeature-class.html
[5]
DisplayFeatureSubScreen API 文档: https://api.flutter-io.cn/flutter/widgets/DisplayFeatureSubScreen-class.html
[6]
@andreidiaconu Github 主页: https://github.com/andreidiaconu
[7]
Surface Duo 模拟器示例: https://docs.microsoft.com/en-us/dual-screen/flutter/samples
[8]
使用 flutter build spa 发布 IPA,无需使用 --export-options-plist: https://github.com/flutter/flutter/pull/97672
[9]
Apple Transport macOS 应用: https://apps.apple.com/us/app/transporter/id1450874784
[10]
在 App Store 发布您的应用: https://flutter.cn/docs/deployment/ios#release-your-app-to-the-app-store
[11]
检查 Xcode 项目设置: https://flutter-io.cn/docs/deployment/ios#review-xcode-project-settings
[12]
RFC: 终止对 32 位 iOS 设备的支持: https://docs.google.com/document/d/1cc5EOsuTlbf4dTDTwmkD3aKjS8XEbVCIqi9BFct9XHM/edit?resourcekey=0-Iv0gXDx7nSDCe3YDfxDKqw
[13]
自定义 web 应用初始化: https://flutter-io.cn/docs/development/platform-integration/web/initialization
[14]
Flutter Lint 2.0.0 package: https://pub.flutter-io.cn/packages/flutter_lints/versions/2.0.0
[15]
Dart Lint 2.0.0 package: https://pub.flutter-io.cn/packages/lints/versions/2.0.0
[16]
Flutter Lint 迁移指南: https://flutter-io.cn/docs/release/breaking-changes/flutter-lints-package#migration-guide
[17]
knopp 的 Github 主页: https://github.com/knopp
[18]
Android 设备上实现的 PR: https://github.com/flutter/engine/pull/29591
[19]
Flutter 引擎性能进一步提升 PR: https://github.com/flutter/engine/pull/30957
[20]
一个数量级: https://flutter-flutter-perf.skia.org/e/?begin=1643063115&end=1644004520&keys=X32827d8819e8271e025f50e77bf2bec0&requestType=0&xbaroffset=27447
[21]
JsouLiang 的 Github 主页: https://github.com/JsouLiang
[22]
提升帧构建速度的基准测试结果: https://flutter-flutter-perf.skia.org/e/?begin=1644581114&end=1644647407&keys=X3999dc0a0c89054eaa9f66bcff27d882&num_commits=50&request_type=1&xbaroffset=27549
[23]
实现新光栅缓存机制的 PR: https://github.com/flutter/engine/pull/31417
[24]
减少内存用量的测试结果: https://flutter-flutter-perf.skia.org/e/?begin=1644790212&end=1646044276&keys=X4c7dd4e4903a38523816c00b31d4d787&requestType=0&xbaroffset=27636
[25]
ColdPaleLight 的 Github 主页: https://github.com/ColdPaleLight
[26]
修复帧调度 bug 的 PR: https://github.com/flutter/engine/pull/31513
[27]
Impeller 一个Flutter 引擎新增的实验性渲染后端: https://github.com/flutter/engine/tree/main/impeller
[28]
较为小巧、简单的着色器实现 PR: https://github.com/flutter/flutter/issues/77412
[29]
flutter/gallery 源码: https://github.com/flutter/gallery
[30]
帧速度提升 20 倍的测试结果: https://flutter-flutter-perf.skia.org/e/?begin=1650297849&end=1651261748&queries=sub_result%3Dworst_frame_rasterizer_time_millis%26test%3Dnew_gallery_impeller_ios__transition_perf%26test%3Dnew_gallery_ios__transition_perf&requestType=0
[31]
google_mobile_ads package: https://pub.flutter-io.cn/packages/google_mobile_ads
[32]
在 Flutter 应用中使用集成平台视图托管您的原生 Android 和 iOS 视图: https://flutter-io.cn/docs/development/platform-integration/platform-views
[33]
Material Design 3 文档: https://m3.material.io/
[34]
将枯燥无味的 Flutter 应用变得生动有趣 Codelab: https://codelabs.developers.google.com/codelabs/flutter-boring-to-beautiful
[35]
Material 3 大的 API 文档: https://api.flutter-io.cn/flutter/material/ThemeData/useMaterial3.html
[36]
Material 3 Umbrella issue: https://github.com/flutter/flutter/issues/91605
[37]
ThemeExtension 的官方文档: https://docs.google.com/document/d/1LbD4JqBgAfHex02oR3r2jyu9lTBBNBmyec2ovT59Kr8/edit
[38]
ThemeExtension 相关示例: https://github.com/guidezpl/flutter/blob/master/examples/api/lib/material/theme/theme_extension.1.dart
[39]
Consent SDK: https://github.com/googleads/googleads-consent-sdk-ios
[40]
google_mobile_ads package: https://pub.flutter-io.cn/packages/google_mobile_ads
[41]
2.10 版之后移除已弃用的 API: https://flutter-io.cn/docs/release/breaking-changes/2-10-deprecations
[42]
页面切换转为使用 ZoomPageTransitionsBuilder: https://flutter-io.cn/docs/release/breaking-changes/page-transition-replaced-by-ZoomPageTransitionBuilder
[43]
Chips 的 useDeleteButtonTooltip 迁移至 deleteButtonTooltipMessage: https://flutter-io.cn/docs/release/breaking-changes/chip-usedeletebuttontooltip-migration
[44]
FLutter 3 的破坏性改动: https://flutter-io.cn/docs/release/breaking-changes
一起看 I/O | Flutter 3 更新详解相关推荐
- 导出jar插件_Fluttify输出的Flutter插件工程详解
系列文章: yohom:Fluttify输出的Flutter插件工程详解zhuanlan.zhihu.com yohom:开发Flutter插件必备原生SDK->Dart接口生成引擎`Flut ...
- fofa自动化爬虫脚本更新+详解
fofa自动化爬虫脚本更新+详解 起因 最近要用到fofa爬虫,为什么要用爬虫不用api,问就是穷,想起来之前写过一个相关的脚本:Fofa-python-脚本,是很久以前写的了,之前写的时候有点问题, ...
- flutter 生命周期详解
flutter 生命周期详解 简介 一.widget 生命周期 二.APP 生命周期 总结 简介 众所周知,程序是有生命周期的,那么flutter 的生命周期是什么呢? flutter 的生命周期大体 ...
- 侍魂胧月传说服务器维护,侍魂胧月传说手游2021年6月2日停机维护更新详解
在侍魂胧月传说手游中2021年6月2日更新了哪些有趣的内容呢?想了解2021年6月2日更新情况如何的话,接下来就让我们一起来看一下吧! 侍魂胧月传说手游2021年6月2日停机维护更新详解 <侍魂 ...
- 数学奥赛用不用计算机,报考自招必看!五大学科竞赛利弊详解,到底哪科最适合你?...
原标题:报考自招必看!五大学科竞赛利弊详解,到底哪科最适合你? 关注 学科竞赛的奖项越来越成为进入清北华五等名校最直接的敲门砖,同时参加学科竞赛对平时学习也有着很大的帮助,建议平时成绩中上游的学生都要 ...
- [Unity2018.2]ShaderGraph更新详解
洪流学堂,让你快人几步!本文首发于洪流学堂微信公众号. 洪流学堂公众号回复节点,获取ShaderGraph节点详解PDF文件(带目录). ShaderGraph 2018.2 更新详解 在2018.1 ...
- 计算机辅助测试普通话考试流程,必看!普通话考试全流程详解!
原标题:必看!普通话考试全流程详解! 2019 普通话考试指南 现在距离11月9号普通话考试只有3天了,但是小伙伴们,你们知道考试流程和检测的方式吗?所以今天我就来为第一次参加普通话考试的同学来科普一 ...
- STM32应用IAP进行程序更新详解及实例
这是以前就想写的一个小专题关于IAP,以及IAP在STM32编程的应用,专题分三小节,主要介绍常见的单片机烧录方式,IAP的实际应用,以及Ymodem协议在IAP编程中应用,在笔记吃灰很久了,终于 ...
- 教你看懂车牌号——全国车牌详解细表
教你看懂车牌号--全国车牌详解细表 北京市(京) A B(出租车) C E F H G(远郊区县) 天津市(津) A B C E(出租车) 河北省(冀) A 石家庄市 B ...
最新文章
- RIFF格式声音文件的实现(转)
- 附录5:TensorFlow基础(一)
- 百度面试题:求数组最大值
- PL/SQL两种case语句写法
- 自学python系列10:python的函数和函数式编程
- 笨办法学python3.6 pdf_“笨办法”学Python3.pdf
- arraylist切割_jdk8 stream list分割 切割 分批次处理工具类
- 谭浩强c++程序设计知识点思维导图
- 使用Redis和Apache Kafka处理时间序列数据
- 分页的limit_Presto分页功能概述
- ionic2+启动白屏问题-------之补充解决之道
- UE4物理模块(二)---建立物体碰撞
- SA / SAM 题目集
- 深度学习_算法工程师 6 万字总结算法面试中的深度学习基础问题
- caffe--交通标志识别
- Redis 官方可视化工具,高颜值,功能太强大!
- html5在线聊天插件,纯js网页在线聊天对话插件(原创)
- 微商大咖,从香港代购开始,做到流水十几亿平台创始人的董小姐
- 敏捷迭代管理 --需求变更规范
- python中button对象的方法_Python cmds.shelfButton方法代码示例
热门文章
- *PAT_甲级_1072 Gas Station (30point(s)) (C++)【Dijkstra/字符串截取/与数字相互转换】
- QTP破解方法,插件延长使用时间方法,及mgn-mqt82.exe下载
- android 对话框 美化,Android修改Dialog样式
- Android 中图片占用内存分析
- aabbcc本质不同的排列数
- 前端知识-CSS定位机制:标准流、浮动、定位
- DRV8818步进电机一种应用场景及实现思路
- 长短期记忆网络 Long Short-Term Memory
- 如何连接到GBase的XDM服务器
- GCC 编译 C 语言文件