flutter 3.3正式发布,原文链接
https://medium.com/flutter/whats-new-in-flutter-3-3-893c7b9af1ff
本地化: CFUG 团队: @AlexV525、@chenglu、@Vadaski、@Nayuta403
中文链接: https://flutter.cn/posts/whats-new-in-flutter-3-3
flutter 3.3正式发布,几个我比较感兴趣的点整理如下
当你的应用包含复杂的导航需求时,它可能会让你晕头转向。为了扩展 Flutter 的导航 API,团队发布了新版本的 go_router package[17],让你在所有平台的路由逻辑设计变得更加简洁。
go_router package 由 Flutter 团队进行维护,通过声明式和基于 URL 的 API 让导航和 deep links 的处理变得更加轻松。最新的 5.0 版本让应用可以通过异步代码进行重定向,其中还包含了一些 破坏性改动 https://files.flutter-io.cn/flutter-design-docs/[Draft]Go_Router%205.0%20migration%20guide%20(PUBLICLY%20SHARED).docx。
更多内容请查看官方文档:路由和导航http://flutter.cn/docs/development/ui/navigation。
本次更新提升了加载资源图片的性能,减少了图片数据的拷贝和 Dart 垃圾回收 (GC) 的压力。先前在加载资源图片时,ImageProvider 需要复制多次压缩的数据。首先,打开图片时数据会被拷贝至原生的堆内存并向 Dart 暴露出结构数组。然后,数据会在结构数组转换至内置存储的 ui.ImmutableBuffer 时被再次拷贝。
随着 新增的 ui.ImmutableBuffer.fromAsset 的引入[27]。这个加载过程同时也会更加快速,因为它会绕过之前方法通道所需的额外调度的开销。特别是在我们的基准测试中,图片的加载速度提升为原先的 2 倍左右。
在 Flutter 2.10 稳定版的发布中,我们为 iOS 启用了 Dart 的内存指针压缩优化。但是,Yeatse 在 GitHub 上提醒我们这项优化中包含了我们并未预料到的后果[29]。Dart 通过为堆保持一个大的虚拟内存来实现指针压缩。由于 iOS 上允许的总虚拟内存少于其他平台,因此其他例如 Flutter 插件之类的组件可持有的虚拟内存便减少了。
虽然禁用了指针压缩会增加 Dart 对象消费的内存,但是它也恢复了 Flutter 应用可用的非 Dart 部分的内存,总体来说是更合适的方案。
应用可以增加最大虚拟内存的分配量,但这项操作仅在较新的 iOS 版本上可用,并不适用于其他 Flutter 支持的 iOS 设备版本。当我们能够在所有位置使用这项优化时,我们会重新进行评估。
在先前的版本中,你需要手动配置一个自定义的 Zone 来捕获应用的所有异常和错误。然而,自定义的 Zone 并不适用于 Dart 核心库中的一些优化,会减慢应用的启动时间。在本次更新中,你可以通过设置 PlatformDispatcher.onError 回调来捕获所有的错误和异常,代替自定义的 Zone。更多内容请查看已经更新的官方文档:在 Flutter 里处理错误[30]。
用 GLSL 编写的并且在 pubspec.yaml 的 shader: 部分声明的片段着色器 (Fragment shader) 现在会自动编译成引擎可以正确识别的格式,并且自动绑定为应用的资源。有了这项改动,开发者无需再使用三方工具编译着色器。在未来,引擎的 FragmentProgram API 可能只能接受来自 Flutter 的工具构建。目前我们还没应用这项更改,但如 FragmentProgram API 改进支持的设计文档[31] 中所计划的,有可能在未来实行。
想要了解更多内容,你可以查看这个 Flutter 着色器示例[32]。
在先前的版本中,Flutter 引擎会将合成层精准地对齐像素,用于提升 Flutter 在旧款 iPhone (32 位) 上的渲染性能。而在我们添加桌面平台的支持后,我们注意到这项操作会导致肉眼可见的抖动,因为桌面平台的是设备像素比通常会更低。例如在较低的 DPR 设备上,提示会在渐入时产生的明显抖动。在确定更新的 iPhone 设备并不需要这项优化后,我们已从 Flutter 引擎中将其移除[33],来改善桌面端的渲染保真度。
此外我们还发现,将这些像素对齐移除后,先前在黄金镜像测试 (golden image test) 时候出现的细微渲染差异也变得更稳定了。