Flutter3[1]是我们正式为全平台提供支持的一个重量级里程碑,距离它的发布仅过去了三个月,今天让我们有请Flutter3.3正式版!近三个月我们并没有放慢更新迭代的速度——自Flutter3发布以来,我们已经为Flutter合并了个拉取请求。
本次更新带来了FlutterWeb平台、桌面端平台、文本处理的性能和其他更新内容。
同时我们也会介绍go_routerpackage、DevTools(开发者工具)和VSCode扩展相关的更新内容。与我们一起阅读详细了解它们吧!
框架更新全局选择到现在为止,Flutter在Web上的文本选择交互仍然没有达到预期。与Flutter应用不同,原生的Web应用会将每个节点构建为树形结构。在传统的Web应用中你可以轻松用拖动手势来选择网页上的节点,这在FlutterWeb应用中无法轻松达成。
从今天起,一切都发生了变化。我们引入了SelectionAreawidget,它的子widget现已可以进行随意选择!
只需使用SelectionArea包裹住路由显示的内容(例如Scaffold),Flutter会替你处理好一切,你便可以享受到这项强力的新特性。
想要更全面深入地了解这个绝妙的新功能,请访问SelectionAreaAPI页面[2]。
触控板操作Flutter3.3优化了针对触控板的支持。Flutter不仅提供了更丰富且顺滑的控制,同时也减少了几种特定情况的误触。若你想了解误触的示例,你可以查看Flutter实用教程[3]页面。将页面滚动到底部的DartPad,并跟随以下步骤进行操作:
缩小窗口让上半部分出现滚动条将指针悬停在上半部分使用触控板进行滚动在Flutter3.3以前,使用触控板滚动会拖动元素,因为Flutter将模拟的手势事件进行了下发从Flutter3.3开始,使用触控板滚动会正确地滚动列表,因为Flutter会传递「滚动」事件,卡片不会识别这些事件,而列表会进行对应的处理想了解更多信息,请访问Flutter触控板手势[4])的设计文档,并且查看以下的拉取请求:
PR:在框架中支持触控板手势[5]PR:iPad上的触控版手势[6]PR:ChromeOS/Android触控板手势[7]PR:Win32的触控板手势[8]PR:Linux的触控板手势[9]PR:Mac上的触控板手势[10]随手写功能感谢来自社区成员fbcouch[11]的出彩贡献。Flutter现在支持在iPadOS上使用ApplePencil进行随手写[12]输入。这项功能已默认在CupertinoTextField、TextField和EditableText上启用。只需要将Flutter升级到3.3就可以为你的用户带来这项新功能。
文本输入为了优化富文本编辑的支持,本次更新我们增加了从底层平台的TextInputPlugin接收更加精细化的更新的能力。以前TextInputClient只能传递新的编辑状态,而不能细分新旧状态之间的变化量,TextEditingDelta和DeltaTextInputClient填充了这部分的信息差。通过访问这些变化量,你可以为输入区域构建自定义的样式,这个区域会在你输入时展开和收缩。想要了解更多信息,你可以查看富文本编辑器示例[13]。
MaterialDesign3支持Flutter团队持续地在整合更多MaterialDesign3的组件到Flutter中。本次更新包括了IconButton[14]的中等和扩大样式。
想要跟踪MaterialDesign3的整合进度,你可以在GitHub上查看将Material3带到Flutter[15]。
IconButton示例Chip示例中型和大型AppBar示例桌面端平台Windows在先前构建Windows桌面应用时,应用的版本只能在文件中进行设置。这样的行为与其他平台上设置版本的行为并不一致。
现在Windows桌面应用的版本可以通过pubspec.yaml和构建参数进行设置。它有助于当你的应用推送了更新时,在应用中为你的用户提供应用更新功能。
想要了解更多关于设置Windows桌面应用版本号的内容,请查看文档[16]。Flutter3.3前创建的项目需要手动进行调整才能使用这项功能。
Packages更新go_router发布当你的应用包含复杂的导航需求时,它可能会让你晕头转向。为了扩展Flutter的导航API,团队发布了新版本的go_routerpackage[17],让你在所有平台的路由逻辑设计变得更加简洁。
go_routerpackage由Flutter团队进行维护,通过声明式和基于URL的API让导航和deeplinks的处理变得更加轻松。最新的5.0版本让应用可以通过异步代码进行重定向,其中还包含了一些破坏性改动[18]。
更多内容请查看官方文档:路由和导航[19]。
VSCode插件增强VSCode的Flutter扩展也带来了添加依赖的更新。你可以使用Dart:AddDependency命令加上逗号一次性添加多个依赖。
你可以查看以下内容了解自上一个Flutter稳定版本发布以来所有VSCode的Flutter插件的更新:
VSCodeextensionsv3.46[20]VSCodeextensionsv3.44[21]VSCodeextensionsv3.42[22]Flutter开发者工具更新自上次Flutter发布稳定版以来,DevTools同样也包含数次更新,包括数据表格展示的用户体验和性能的提升,还有在滚动事件的长列表时减少卡顿(#[23]。
以下是自Flutter3.0以来DevTools各个版本更新的公告内容:
FlutterDevTools2.16.0发行注记[24]FlutterDevTools2.15.0发行注记[25]FlutterDevTools2.14.0发行注记[26]性能改进Raster缓存改善本次更新提升了加载资源图片的性能,减少了图片数据的拷贝和Dart垃圾回收(GC)的压力。先前在加载资源图片时,ImageProvider需要复制多次压缩的数据。首先,打开图片时数据会被拷贝至原生的堆内存并向Dart暴露出结构数组。然后,数据会在结构数组转换至内置存储的ui.ImmutableBuffer时被再次拷贝。
随着新增的ui.ImmutableBuffer.fromAsset的引入[27]。这个加载过程同时也会更加快速,因为它会绕过之前方法通道所需的额外调度的开销。特别是在我们的基准测试中,图片的加载速度提升为原先的2倍左右。
更多相关信息,请查看官方文档:添加ImageProvider.loadBuffer[28]。
框架稳定性禁用iOS内存指针压缩在Flutter2.10稳定版的发布中,我们为iOS启用了Dart的内存指针压缩优化。但是,Yeatse在GitHub上提醒我们这项优化中包含了我们并未预料到的后果[29]。Dart通过为堆保持一个大的虚拟内存来实现指针压缩。由于iOS上允许的总虚拟内存少于其他平台,因此其他例如Flutter插件之类的组件可持有的虚拟内存便减少了。
虽然禁用了指针压缩会增加Dart对象消费的内存,但是它也恢复了Flutter应用可用的非Dart部分的内存,总体来说是更合适的方案。
应用可以增加最大虚拟内存的分配量,但这项操作仅在较新的iOS版本上可用,并不适用于其他Flutter支持的iOS设备版本。当我们能够在所有位置使用这项优化时,我们会重新进行评估。
API改进PlatformDispatcher.onError在先前的版本中,你需要手动配置一个自定义的Zone来捕获应用的所有异常和错误。然而,自定义的Zone并不适用于Dart核心库中的一些优化,会减慢应用的启动时间。在本次更新中,你可以通过设置PlatformDispatcher.onError回调来捕获所有的错误和异常,代替自定义的Zone。更多内容请查看已经更新的官方文档:在Flutter里处理错误[30]。
FragmentProgram更新用GLSL编写的并且在pubspec.yaml的shader:部分声明的片段着色器(Fragmentshader)现在会自动编译成引擎可以正确识别的格式,并且自动绑定为应用的资源。有了这项改动,开发者无需再使用三方工具编译着色器。在未来,引擎的FragmentProgramAPI可能只能接受来自Flutter的工具构建。目前我们还没应用这项更改,但如FragmentProgramAPI改进支持的设计文档[31]中所计划的,有可能在未来实行。
想要了解更多内容,你可以查看这个Flutter着色器示例[32]。
布局小数处理在先前的版本中,Flutter引擎会将合成层精准地对齐像素,用于提升Flutter在旧款iPhone(32位)上的渲染性能。而在我们添加桌面平台的支持后,我们注意到这项操作会导致肉眼可见的抖动,因为桌面平台的是设备像素比通常会更低。例如在较低的DPR设备上,提示会在渐入时产生的明显抖动。在确定更新的iPhone设备并不需要这项优化后,我们已从Flutter引擎中将其移除[33],来改善桌面端的渲染保真度。
此外我们还发现,将这些像素对齐移除后,先前在黄金镜像测试(goldenimagetest)时候出现的细微渲染差异也变得更稳定了。
停止支持32位iOS在我们发布Flutter3.0时曾经提到,由于使用量的减少,3.0版本是最后一个支持32位iOS设备以及iOS9和10的版本。这个改动将会影响iPhone4S、iPhone5、iPhone5C以及第2、3、4代iPad设备。Flutter3.3稳定版以及之后的稳定版将不再支持32位iOS设备以及iOS。这意味着使用Flutter3.3及之后构建的应用将不能再上述设备上运行。
macOS10.11和10.12的支持进入尾声在即将到来的第四季度的正式版发行计划中,我们将放弃对macOS版本10.11和10.12的支持。这意味着在此之后的FlutterSDK稳定版将不能在这些版本上运行,Flutter最低支持的macOS版将上升为10.13HighSierra。
停止支持Bitcode即将发布的Xcode14将不再支持提交含有Bitcode的iOS应用[34],这个版本的Xcode会对开启了bitcode的项目发出警告。因此Flutter将会在未来的稳定发行版中移除对bitcode的支持。我们不希望影响到很多的开发者,因此默认情况下,Flutter将不会开启bitcode。然而,如果你手动在Xcode项目中开启了bitcode,请尽快在升级到Xcode14之后关闭它。
你可以打开ios/Runner.xcworkspace并在buildsetting中将EnableBitcode设置为No以关闭它。混合开发应用可以在宿主工程的Xcode项目中关闭它。
你可以查阅Apple文档[35]了解更多关于bitcode分发的内容。
结语GoogleFlutter团队非常感谢社区中的每一位成员们为了让Flutter的体验变得更好所付出的所有努力,我们期待在已完成的工作上继续努力,并且我们始终重视我们最重要最宝贵的财富——社区中的每一位成员!
“原文链接: