核心部分原文链接:medium.com/flutter/wha…
虽然本次 I/O 的核心 keynote 首要是 AI ,可是按照惯例仍然发布了新的 Flutter 稳定版,不过并非大家猜测的 4.0,而是 3.10 ,Flutter 的版别号仍然那么的出其不意。
Flutter 3.10 首要包含有对 Web、mobile、graphics、安全性等方面的相关改善,核心其实便是:
- iOS 默许运用了 Impeller
- 一堆新的 Material 3 控件袭来
- iOS 功用优化,Android 顺带可有可无的更新
- Web 能够无 iframe 嵌套到其他运用
Framework
Material 3
看起来谷歌关于 Material 3 的规划标准很上心,依据最新的 Material Design spec 标准 Flutter 也跟进了相关的修正,其间包含有新组件和组件主题和新的视觉作用等。
现在仍然是由开发者能够在 MaterialApp
主题装备下,经过 useMaterial3
标志位挑选是否运用 Material 3,不过从下一个稳定版别开始,useMaterial3
默许会被调整为 true
。
关于 Material 3 ,能够经过 flutter.github.io/samples/mat… 上的相关 Demo 预览。
ColorScheme.fromImageProvider
一切 M3 组件装备主题的默许色彩 ColorScheme
,默许配色计划运用紫色 shades,这有差异于之前默许的蓝色。
除了能够从单一 “seed” 色彩来定制装备计划之后,经过 fromImageProvider
图画也能够创立自定义配色计划。
NavigationBar
本次还增加了一个 M3 版别的 BottomNavigationBar
控件作用,虽然 M3 运用不同的色彩、highlighting 和 elevation,但它的工作办法其实仍是和曾经一样。
假如需求调整 NavigationBars
的默许外观,能够运用运用 NavigationBarTheme
来掩盖修正,虽然现在你不需求将现有 App 搬迁到 NavigationBars
,可是官方建议仍是尽或许在新项目里运用 NavigationBars
作为导航控件。
NavigationDrawer
M3 针对 Drawer 相同供给了新的 NavigationDrawer
,它经过 NavigationDestinations
显示单选列表,也能够在该列表中包含其他控件。
同步M3下
Drawer
也更新了色彩和高度,同时对布局进行了一些小的更改。
NavigationDrawer
需求时能够滚动,假如要掩盖 NavigationDrawer
的默许外观,相同能够运用 NavigationDrawerTheme
来掩盖。
SearchBar 和 SearchAnchor
这是 Flutter 为查找查询和供给预测作用新增的控件。
当用户在输入查找查询时,会在 “search view” 中计算匹得到一个配响应列表,用户挑选一个成果或调整匹配成果。
假如要掩盖 SearchBarTheme
的默许外观,相同能够运用 SearchAnchorTheme
来掩盖。
Secondary Tab Bar
M3 下 Flutter 现在默许供给创立第二层选项卡式内容的支撑,针对二级 Tab 能够运用 TabBar.secondary
。
DatePicker 和 TimePicker 更新
M3下 DatePicker
更新了控件的日历、文本字段的色彩、布局和形状等,对应 API 没有变动,但会个新增了 DatePickerTheme
用于调整控件款式。
TimePicker
和DatePicker
一样,更新了控件的惯例版别和紧凑版别的色彩、布局和形状。
BottomSheet 更新
M3 下 BottomSheet
除了色彩和形状更新之外,还增加了一个可选的拖动手柄,当设置 showDragHandle
为 true
时收效。
ListTile 更新
M3下 ListTile
更新了定位和距离,包含 content padding、leading 和 trailing 控件的对齐、minimum leading width, 和 vertical spacing 等,可是 API 保持不变。
TextField 更新
M3 更新了一切 TextField
对原生手势支撑。
用鼠标双击或三次点击 TextField
和在接触设备上双击或三次点击作用相同,默许情况下 TextField
和CupertinoTextField
都能够运用该功用。
TextField
double click/tap 手势
- Double click + drag:扩展字块中的挑选。
- Double tap + drag:扩展字块中的挑选。
TextField
triple click/tap 手势
Triple click
- 在多行
TextField
(Android/Fuchsia/iOS/macOS/Windows) 中挑选点击方位的阶段块。 - 在多行
TextField
(Linux) 内部时,在 click 方位挑选一个行块。 - 挑选单行中的一切文本
TextField
。
Triple tap
- 在 multi-line
TextField
中挑选点击方位的阶段块 。 - 挑选单行
TextField
中的一切文本
Triple click+拖动
- 扩展阶段块中的挑选 (Android/Fuchsia/iOS/macOS/Windows)。
- 扩展行块中的挑选 (Linux)。
简单来说,便是手势和鼠标在双击和三击下,会触发不同的挑选作用,而且 Linux 在三击作用下会有点差异
Flutter 支撑 SLSA 等级 1
Flutter Framework 现在运用软件工件供应链等级 ( SLSA ) 等级 1 进行编译,这里边支撑了许多安全功用的实现,包含:
- 脚本化构建进程:Flutter 的构建脚本现在允许在受信任的构建渠道上主动构建,建立在受保护的架构上有助于防止工件篡改,然后提高供应链安全性。
- 带有审计日志的多方同意:Flutter 发布工作流程仅在多个工程师同意后履行,一切履行都会创立可审计的日志记录,这些更改确保没有人能够在源代码和工件生成之间引进更改。
- 出处:Beta 和稳定版别现在运用 provenance 构建,这意味着具有预期内容的可信来源构建了框架发布工件,每个版别都会发布链接以检查和验证 SDK 存档 的出处。
这项工作还在朝着 SLSA L2 和 L3 合规性迈进,这两个等级侧重于在构建进程中和构建之后供给 artifacts 保护。
Web
改善了加载时刻
3.10 减小了图标字体的文件巨细,它会从 Material 和 Cupertino 中删除了未运用的字形,然后供给了更快加载。
CanvasKit 变小
根据 Chromium 的浏览器能够运用更小的自定义 CanvasKit 途径,托管在 Google gstatic.com 上的 CanvasKit 能够进一步提高功用。
Element 嵌入
现在能够 从页面中的特定 Element 来加载 Flutter Web ,不需求 iframe
,在这个版别之前 fluter web 是需求填充整个页面主体或显示在 iframe
符号内,简单说便是把 flutter web 嵌套到其他 Web 下更方便了。
详细 Demo 可见:github.com/flutter/sam…
着色器支撑
Web 运用能够运用 Flutter 的 fragment shader :
flutter:
shaders:
- shaders/myshader.frag
Engine
Impeller
在 3.7 稳定版中 iOS 供给了 Impeller 预览支撑,从那时起 Impeller 就收到并处理了用户的很多反应。
在 3.10 版别中,咱们对 Impeller 进行了 250 屡次提交,现在咱们将 Impeller 设置为 iOS 上的默许烘托器。
默许情况下,一切运用 Flutter 3.10 为 iOS 构建的运用都运用 Impeller,这样 iOS 运用预计将会有更少的卡顿和更共同的功用。
自 3.7 版别以来,iOS 上的 Impeller 改善了内存占用,能够运用较少的烘托通道和中心烘托目标。
在较新的 iPhone 上,启用有损纹路压缩可在不影响保真度的情况下削减内存占用,这些进步也显着提高了 iPad 的功用。
比如 Wonderous 运用中的 “pull quote” 页面,这些改善是的当前页面下的内存占用量削减了近一半。
内存运用量的削减也适度降低了 GPU 和 CPU 负载,Wondrous 运用或许不会记录这些负载下降,它的框架之前现已优化的不错,但这一变化应该会延长续航才能。
Impeller 还释放了团队能够更快地交给流行功用恳求的才能,例如在 iOS 上支撑更广泛的 P3 色域。
社区奉献加快了咱们的进步,特别是 GitHub 用 户ColdPaleLight 和 luckysmg ,他们编写了多个与 Impeller 相关的补丁,提高了保真度和功用。
虽然 Impeller 满意大多数 Flutter 运用的烘托需求,但你能够挑选关闭 Impeller。假如挑选退出,请考虑在 GitHub 上提交问题以告诉咱们原因。
<key>FLTEnableImpeller</key>
<false/>
用户或许会注意到 Skia 和 Impeller 在烘托时存在细微差别,这些差异或许是过错,所以请有必要在 Github 上提出问题,在未来的版别中,咱们将删除适用于 iOS 的旧版 Skia 烘托器以减小 Flutter 的巨细。
别的,Impeller 的 Vulkan 后端然在支撑傍边,Android 上的 Impeller 仍在积极开发中,但尚未准备好进行预览。
要了解 Impeller 进展,请检查 github.com/orgs/flutte…
Performance
3.10 版别涵盖了除 Impeller 之外还有更多功用改善和修正。
消除卡顿
这里要感谢 luckysmg, 他们发现能够缩短从 Metal 驱动获取下一个可绘制层的时刻,而办法便是需求将 FlutterViews
布景色彩设置为非零值。
此更改消除了最近 iOS 120Hz 显示器上的低帧率问题,在某些情况下它会使帧速率增加三倍,这帮助咱们处理了六个 GitHub issue。
这一变化具有意义严重,以至于咱们向后移植了一个修补程序到 3.7 版别中。
在 3.7 稳定版中,咱们将本地图画的加载从渠道线程转移到 Dart 线程,以防止推迟来自渠道线程的 vsync 事情。可是用户注意到 Dart 线程上的这项额外工作也导致了一些卡顿。
在 3.10 中,咱们将本地图画的打开和解码从 Dart 线程移至后台线程,这个更改消除了具有很多本地图画的屏幕上潜在的长期中止,同时防止了推迟 vsync 事情,在咱们的本地测验和主动化基准测验中,这个更改将多个同步图画的加载时刻缩短了一半。
咱们持续在 Flutter 新的内部 DisplayList 结构之上构建优化,在 3.10 中,咱们增加了 R-Tree based culling 机制。
这种机制在咱们的烘托器中更早地移除了绘制操作的处理。例如 优化加快了输出在屏幕外失败的自定义painter。
咱们的 microbenchmarks 显示 DisplayList 处理时刻最多削减了 50%,具有裁剪自定义绘画的 App 或许会看到不同作用的改善,改善的程度取决于隐藏绘制操作的复杂性和数量。
削减 iOS 发动推迟
之前运用中标识符查找的低效战略增加了运用发动推迟,这个发动推迟的增长与运用的巨细成正比。
而在 3.10 中,咱们修正了 bundle identifier lookup,这将大型运用的发动推迟削减了 100 毫秒或大约 30–50%。
缩小尺度
Flutter 运用 SkParagraph
作为文本、布局和烘托的默许库,之前咱们包含了一个标志以支撑回退到留传 libtxt
和 minikin
。
由于咱们对 SkParagraph
有充分的信心,咱们在 3.10 中删除了 libtxt
和 minikin
以及它们的标志,这将 Flutter 的压缩巨细削减了 30KB。
看起来信心十足了。
稳定性
在 3.0 版别中,咱们在烘托管道后期启用了一项 Android 功用,该功用运用高级 GPU 驱动,当只要一个“dirty” 区域产生变化时,这些驱动功用会从头绘制较少的屏幕内容。
咱们之前现已将它增加到早期的优化中以达到类似的作用,虽然咱们的基准测验成果不错,但仍是呈现了两个问题:
- 首先,改善最多的基准或许不代表实际用例。
- 其次,事实证明很难找到支撑此 GPU 驱动功用的设备和 Android 版别集
鉴于有限的进步和支撑,咱们在 Android 上禁用了部分重绘功用。
而运用 Skia 后端时,该功用在 iOS 上仍然保持启用状况,咱们期望在未来的版别中能够经过 Impeller 启用它。
API 改善
APNG解码器
Flutter 3.10 处理了一个咱们最受关注的问题,它增加了 APNG
解码图画的才能,现在能够运用 Flutter 现有的图片加载 API 来加载 APNG
图片。
图片加载 API 改善
3.10 增加了一个新办法 instantiateImageCodecWithSize
,该办法满意以下三个条件的用例支撑:
- 加载时宽高比未知
- 边界框束缚
- 原始纵横比束缚
Mobile
iOS
无线调试
现在能够在无线的情况下运转和热从头加载的 Flutter iOS 运用。
在 Xcode 中成功无线配对 iOS 设备后,就能够运用 flutter run 将运用部署到该设备,假如遇到问题,请在 Window > Devices 和 Simulators > Devices下验证网络图标是否呈现在设备周围。
要了解更多信息,能够查阅 docs.flutter.dev/get-started…
宽色域图画支撑
iOS 上的 Flutter 运用现在能够支撑宽色域图画的准确烘托,要运用宽色域支撑,运用有必要运用 Impeller 并在 Info.plist
文件增加 FLTEnableWideGamut
标志。
拼写检查支撑
SpellCheckConfiguration()
控件现在默许支撑 Apple 在 iOS 上的拼写检查服务,能够运用 spellCheckConfiguration
中的参数对其进行设置 CupertinoTextField
。
自适应复选框和单选
3.10 将 CupertinoCheckBox
和 CupertinoRadio
增加到库中 Cupertino
,他们创立契合 Apple 款式的复选框和单选按钮组件。
Material 复选框和单选控件增加了 .adaptive
结构函数,在 iOS 和 macOS 上,这些结构函数运用相应的 Cupertino 控件,在其他渠道上运用 Material 控件。
优化 Cupertino 动画、过渡和色彩
Flutter 3.10 改善了一些动画、过渡和色彩以匹配 SwiftUI,这些改善包含:
-
更新
CupertinoPageRoute
-
增加标题扩大动画
CupertinoSliverNavigationBar
- 增加几种新的 iOS 体系色彩
CupertinoColors
PlatformView 功用
当 PlatformViews
呈现在屏幕上时,Flutter会约束 iOS 上的刷新率以削减卡顿,当运用显示动画或可滚动时,用户或许会在运用呈现 PlatformViews
时注意到这一点。
macOS 和 iOS 能够在插件中运用同享代码
Flutter 现在支撑插件 pubspec.yaml
文件中的 sharedDarwinSource
,这个 key 表明 Flutter 应该同享 iOS 和 macOS 代码。
ios:
pluginClass: PathProviderPlugin
dartPluginClass: PathProviderFoundation
sharedDarwinSource: true
macos:
pluginClass: PathProviderPlugin
dartPluginClass: PathProviderFoundation
sharedDarwinSource: true
运用扩展的新资源
咱们为 Flutter 开发人员增加了运用 iOS 运用扩展文档,这些扩展包含实时活动、主屏幕控件和同享扩展。
为了简化创立主屏幕控件和同享数据,咱们向 path_provider
和 homescreen_widget
插件增加了新办法。
详细可见:docs.flutter.dev/development…
跨渠道规划的新资源
该文档现在包含针对特定 UI 组件的跨渠道规划注意事项,要了解有关这些 UI 组件的更多信息,请检查Flutter UX GitHub 存储库中的讨论: github.com/flutter/uxr…
详细可见:docs.flutter.dev/resources/p…
Android
Android CameraX 支撑
Camera X 是一个 Jetpack 库,可简化向 Android 运用增加丰厚的相机功用。
该功用适用于多种 Android 相机硬件,在 3.10 中,咱们为 Flutter Camera 插件增加了对 CameraX 的开始支撑,此支撑涵盖以下用例:
- 图画捕捉
- 视频录制
- 显示实时相机预览
Dependencies:
camera: ^0.10.4 # 最新相机版别
camera_android_camerax: ^0.5.0
开发者东西
咱们持续改善了 DevTools,这是一套用于 Dart 和 Flutter 的功用和调试东西,一些亮点包含:
- DevTools UI 运用 Material 3,这让外观现代化又增强了可访问性。
- DevTools 控制台支撑在调试模式下评价正在运转的运用,在 3.10 之前,只能在暂停运用时履行此操作。
- 嵌入式 Perfetto 盯梢检查器替代了曾经的时刻线盯梢检查器。
Perfetto 能够处理更大的数据集,而且比传统的盯梢检查器表现得更好,例如:
- 允许固定感兴趣的线程
- 单击并拖动以从多个帧中挑选多个时刻轴事情
- 运用 SQL 查询从时刻轴事情中提取特定数据
弃用和严重更改
弃用的 API
3.10 中的严重更改包含在 v3.7 发布后过期的弃用 API。
要检查一切受影响的 API 以及其他上下文和搬迁攻略,请检查之前版别的弃用攻略。
Dart Fix 能够修正其间的许多问题,包含在 IDE 中快速修正和运用
dart fix
指令批量运用。
Android Studio Flamingo 升级
将 Android Studio 升级到 Flamingo 后,你或许会在尝试 flutter run
或 flutter build
Flutter Android 运用时看到过错。
产生此过错是因为 Android Studio Flamingo 将其绑缚的 Java SDK 从 11 更新到 17,运用 Java 17 时,之前的 7.3 Gradle 版别无法运转。
咱们更新来了 flutter analyze --suggestions
以验证是否由于 Java SDK 和 Gradle 版别之间的不兼容而产生此过错。
要了解修正此过错的不同办法,请检查咱们的搬迁攻略:docs.flutter.dev/go/android-…
Window singleton 弃用
该版别弃用了 Window singleton,依靠它的运用和库需求开始搬迁。
当你的运用在未来版别的 Flutter 中做支撑时,这会能够为你的运用提前做好多窗口准备支撑。
PS:还能够关注下本次 I/O 根据 Flutter 发布的新小游戏:I/O FLIP 小游戏