Flutter 3.13 新功能
视频
www.youtube.com/watch?v=bhX...
www.bilibili.com/video/BV1fG...
前言
2D滚动,更快的图形,Material 3更新等等
欢迎回到我们的季度Flutter稳定版本发布,这次是Flutter 3.13!自上次发布以来仅仅三个月的时间,我们已经合并了724个拉取请求,并有55位社区成员首次为Flutter做出了贡献!
继续阅读,了解Flutter社区为这个最新版本做出的所有新功能和改进!
Engine 引擎
我们对Impeller进行了几项改进------我们的新图形渲染器,并为可折叠设备添加了新的引擎API。
Impeller
iOS 性能改进
由于Flutter用户提供的高质量反馈,我们在这个版本中继续改进了iOS上的Impeller性能。通过许多不同的优化,iOS上的Impeller渲染器不仅具有更低的延迟(通过完全消除着色器编译卡顿),而且在某些基准测试中还具有更高的平均吞吐量。特别是在我们的flutter/gallery过渡性能基准测试中,平均帧栅格化时间现在约为Skia的一半。
在iPhone 11上,改进了Flutter Gallery过渡性能基准测试中的平均帧栅格化时间。涵盖的时间段大致从3.10分支切换到3.13分支切换的时间。
这一进展要归功于这些和其他的优化措施,包括:
- 启用脏区域管理和部分重绘 (flutter/engine#40959)
- 实现了并发渲染通道编码 (flutter/engine#42028)
- 对文本渲染进行了多项改进 (flutter/engine#41290, flutter/engine#41780, flutter/engine#42417)
- 为了避免昂贵的细分调用,添加了凸形状的快速路径 (flutter/engine#41834)
- 开始使用计算着色器进行一些操作 (flutter/engine#42192)
- 更积极地剔除越界的绘制操作 (flutter/engine#41606)
忠诚度的提升
在3.10版本中,我们宣布在使用Impeller时,广色域颜色可以通过一个标志进行设置。在听取并解决用户反馈后,现在在iOS上使用Impeller时,广色域颜色已成为默认设置。
Android Impeller 进展更新
我们在Impeller的Vulkan后端上取得了进展,但它还没有达到足够高质量的水平,以至于正式预览期对用户来说是有用的。我们希望确保用户在Android上第一次使用Impeller时能够获得高质量的体验,但我们还没有完全达到这个目标。我们希望在今年晚些时候的稳定版本中进入Impeller在Android上的预览期。尽管Impeller在Android上还没有准备好进行预览,但OpenGL和Vulkan后端已经从我们在过去一年中对Impeller的HAL进行的许多后端不可知优化中受益。特别是在flutter/gallery过渡性能基准测试中,Android的平均帧栅格化时间也有了显著改善。我们正在进行进一步的改进,以确保Android上的预览质量更高。
我们的进展再次得到了社区的大力支持,特别是GitHub用户ColdPaleLight,他贡献了几个备受赞赏的与Impeller相关的补丁,提高了保真度和性能,还增加了对锥形渐变的支持。
请继续通过GitHub上的Impeller项目仪表板跟踪我们的进展。我们非常感谢所有的反馈,并鼓励用户继续在问题跟踪器中提交关于准确性和性能的问题。
Impeller (and Wonderous) on macOS
在我们最新的稳定版本中,我们宣布Impeller,我们的渲染引擎的重写版本,将默认在iOS上启用。自那时以来,我们收到了客户的很好反馈。现在,我们很高兴地宣布Impeller for macOS已经可以预览使用了。您可以按照Impeller页面上的指南测试和启用Impeller在您的应用程序中。
我们渴望您能测试并提供反馈。帮助我们改进macOS上的Impeller的最佳方式是在没有SkSL预热的情况下运行您的macOS应用程序,并使用DevTools查找由于着色器编译而导致的卡顿情况。接下来,使用Impeller测试您的应用程序-点击并检查错误、性能改进或性能退化。如果您注意到任何问题,我们强烈建议您在GitHub上提交问题。请确保包括您运行的设备信息、视频录制和性能跟踪的导出文件。
想在 macOS 上尝试 Impeller 吗?从 Mac App Store 安装 Wonderous!
新的引擎API
改进的可折叠设备支持
为了更好地支持可折叠设备,我们添加了一个新的API来获取显示器的各种属性。新的getter FlutterView.display返回一个Display对象。Display对象报告了显示器的物理尺寸、设备像素比和刷新率。请查看setPreferredOrientations的示例,该示例使用了新的API。
master-api.flutter.dev/flutter/dar...
master-api.flutter.dev/flutter/dar...
master-api.flutter.dev/flutter/ser...
Framework 框架
Material
我们对Material Framework进行了一系列的改进,以提供更多的平台适应性,允许更多的定制化,并增加了新的功能。
文本字段中的字符识别
在iOS上使用TextField时,用户会自动看到一个选项,可以使用设备相机识别字符并将其插入到字段中。
这个功能的实现离不开社区成员luckysmg(作者)和tgucio(审查者)的贡献。这个功能是一个1000行代码和70次提交的努力,成功地连接了引擎和框架!谢谢你们!
平台适应性对话窗口
已经为AlertDialog添加了一个自适应构造函数,以及一个自适应函数showAdaptiveDialog,根据当前平台显示Material或Cupertino对话框。
现在使用AlertDialog.adaptive()在iOS上使用CupertinoAlertDialog小部件:
api.flutter.dev/flutter/cup...
在Android上的 Material AlertDialog。
api.flutter.dev/flutter/mat...
CupertinoDatePicker 带有月份和年份
为CupertinoDatePicker添加了一个monthYear模式。
(iOS风格)的选择样式单选按钮
新增了useCheckmarkStyle属性到CupertinoRadio。这也允许Radio.adaptive和RadioListTile.adaptive小部件控制它们在iOS上是否使用勾选标记样式。
更多的自定义选项适用于Material小部件
有几项改进使得自定义Material小部件的设计更加容易:
- 现在您可以使用错误属性来自定义在文本字段上显示的错误小部件,而不是使用字符串
- 现在您可以为ButtonSegment添加工具提示:
- 您现在可以使用material GapSize属性来自定义ExpansionPanelList中的间隙
- 现在您可以自定义Switch的trackOutlineWidth
- 您现在可以使用NavigationDrawer上的tilePadding属性自定义填充
- 您可以使用TabBar的alignment属性来选择如何对齐选项卡
MaterialState color for chips 状态颜色
这使得可以在所有不同的状态下自定义筹码的颜色。
Elevated Chips
根据Material 3规范,已添加了FilterChip.elevated、ChoiceChip.elevated和ActionChip.elevated变体。
onSubmitted to SearchBar 提交给搜索栏
当用户完成文本输入并按下键盘上的"完成"按钮时,允许触发不同的操作。
BaseTapAndDragGestureRecognizer
已添加了一个基类,用于一组类,其中包括对轻触+平移(TapAndPanGestureRecognizer)和轻触+水平拖动(TapAndHorizontalDragGestureRecognizer)的支持。这些类已经被用于实现原生文本字段手势。然而,它们也非常适用于其他用例------例如,使用双击+垂直拖动手势来缩放小部件。
App Lifecycle Changes 应用程序生命周期变化
AppLifeCycleListener
为了监听应用程序生命周期的变化并响应退出应用程序的请求,添加了AppLifecycleListener类。
Scrolling 滚动
TwoDimensional scrolling foundation 二维滚动基础
这个 Flutter 的版本还包含了构建在两个维度上滚动的小部件的基础,这意味着有一堆新的类可以使用,包括:
- ChildVicinity, 类似于一维滚动视图中的索引,表示孩子在二维空间中的相对位置。
- TwoDimensionalChildDelegate,类似于SliverChildDelegate,具有同样类似的子类:TwoDimensionalChildBuilderDelegate和TwoDimensionalChildListDelegate
- TwoDimensionalScrollView是一个抽象基类,它创建一个TwoDimensionalScrollable和TwoDimensionalViewport,与一维ScrollView的模型相匹配。
- RenderTwoDimensionalViewport,最后,是在二维中布局盒子子元素的工作马。
在两个维度上滚动也带来了一些新的交互方式,包括对角线滚动。请参考DiagonalDragBehavior了解新的交互类型,并在您的TwoDimensionalScrollView或TwoDimensionalScrollable上进行配置。
我们进行了一项用户研究,以便为开发者们打下这个基础,让他们能够在任何方向上进行滚动并构建他们能够想象到的任何东西。在这个DartPad中,我们实现了一个简单的、懒加载的二维网格示例,代码只有大约200行!
Flutter团队已经开始在这个框架上构建二维滚动小部件,即将在two_dimensional_scrollables包中推出。
New slivers 新的
Flutter 3.13 带来了一组新的 slivers,用于组合独特的滚动效果。
SliverMainAxisGroup和SliverCrossAxisGroup都支持将多个sliver排列在一起。在主轴上,这可以创建一种效果,即粘性标题,允许固定的标题在每个sliver组滚动时被推出视野。
交叉轴分组允许将滑片在视口中并排排列,同时(也是新的)小部件,如SliverCrossAxisExpanded和SliverConstrainedCrossAxis,能够确定交叉轴上每个分组滑片的空间分配。
新的sliver库中还有DecoratedSliver,类似于DecoratedBox。这允许用户装饰一个sliver,甚至可以是一个sliver组,使用Decoration。
在DartPad示例中,看看所有这些新的片段如何运作。
Accessibility 无障碍
Accessibility updates 可访问性更新
- 为了在CupertinoSwitch上显示输入/输出标签,添加了onOffSwitchLabels辅助功能属性
- 已添加FocusSemanticEvent。但是,使用时应谨慎,因为它可能会破坏用户对辅助功能焦点工作方式的期望。
- IconButton的isSelected现在可以供屏幕阅读器使用。 github.com/flutter/flu...
Platforms 平台
Android 安卓
New support targets 新的支持目标
通过此版本,Flutter现在支持针对Android 14/API 34进行目标定位。虽然我们仍在Android 14中开发一些新功能(例如预测性后退导航),但我们已经对此版本进行了全面测试,并优先修复您可能发现的任何相关问题。
iOS
在iOS上减少旋转失真
当iOS屏幕旋转时,Flutter应用程序以前会出现一些变形,与原生iOS应用程序看起来不同。我们进行了一些修改以减少变形:
重命名 Runner
创建Flutter iOS应用程序时,在 /ios
文件夹中创建了一个Runner Xcode项目和Xcode工作区。现在,您可以重命名工作区或项目,以免出现一长串的Runners。
Preparing for iOS 17 and Xcode 15 准备iOS 17和Xcode 15
随着iOS 17和Xcode 15的即将发布,希望使用这个工具链进行开发的用户需要使用Flutter 3.13版本。此外,在下载Xcode 15时,请确保同时下载iOS 17模拟器。
Games 游戏
Flutter games updates Flutter游戏更新
我们在2022年推出了Flutter休闲游戏工具包,其中包括游戏模板、教程、文档、社区空间以及GCP/Firebase/Ad积分,以帮助Flutter开发者快速启动游戏开发。自那时以来,已经有数以万计的游戏使用Flutter发布!自推出以来,我们积极与Flutter游戏开发者互动并进行调查,以了解如何改进游戏工具包。几乎所有开发者都提到希望获得更多资源和示例代码,以帮助他们更好地设计、开发和盈利他们的游戏。
今天,我们将发布Flutter Games网页的新更新,其中包括视频资源的轮播和新游戏,供您在Flutter中构建时了解。在接下来的几个月中,我们将推出一系列新的工具包更新,提供额外的资源和示例,以帮助您开始游戏开发之旅。
作为第一步,我们于2023年7月与AdMob合作,共同举办了一场专为Flutter游戏开发者举办的独家UX设计和变现工作坊。约100名开发者通过在线互动研讨会加入了我们,并给予了4.6/5.0的满意度评价。我们希望很快能够总结工作坊的内容,并与大家分享这些见解。
我们正在积极努力进行更多的更新,敬请关注!如果您已经在使用游戏工具包,并且愿意向我们发送未来改进的想法,请随时通过flutter-games@google.com给我们发送电子邮件。
Tooling 工具制造
DevTools 开发者工具
新的DevTools功能
我们对DevTools的性能和可用性进行了改进,包括:
我们在导航栏上添加了一个新的溢出菜单,用于处理无法一次显示所有选项卡的情况。
我们在内存选项卡上添加了一个班级类型的图例。
此外,我们使CPU分析器中的树形表格滚动更快、更流畅。在调试器中,我们将文件搜索或文件搜索速度提高了5倍。
要了解更多信息,请查看DevTools 2.25.0和DevTools 2.24.0的发布说明。
重大变更和弃用
重大变更
下一个版本中,默认情况下的Material3
我们很高兴地宣布,在下一个Flutter稳定版本中,我们计划将ThemeData的useMaterial3默认值从false更改为true。换句话说,默认情况下,应用程序将获得Material 3的颜色、文本样式和其他视觉效果。
Material 3的演示应该有助于预览M2和M3之间的差异。
flutter.github.io/samples/web...
Android支持的平台
Flutter不再支持Android Jelly Bean API级别(16、17和18)。好消息是,大多数应用程序应该默认迁移到这个新的minSdkVersion。
然而,如果您没有自动迁移,可能是因为您对模块级别的build.gradle进行了更改,您可能需要手动增加minSdkVersion。要进行更新,请在Flutter项目的根目录中找到模块级别的 build.gradle
。通常可以在 <YOUR PROJECT>/android/app/build.gradle
找到。将 minSdkVersion
版本提升至19。如果您看到了flutter.minSdkVersion,并且至少为19,则表示您的最低版本设置正确。
Flutter插件不会默认迁移,因此插件作者应该更新位于 minSdkVersion
的顶层 build.gradle
文件中的 <YOUR PLUGIN>/android/build.gradle
。
变更列表和迁移指南
docs.flutter.dev/release/bre...
docs.flutter.dev/development...
此版本中的重大变更包括在v3.10发布后过期的已弃用API。要查看所有受影响的API以及其他上下文和迁移指南,请参阅此版本的弃用指南。其中许多都由Flutter Fix支持,包括IDE中的快速修复和使用dart fix命令进行批量应用。
一如既往,非常感谢社区为我们提供测试,它们帮助我们识别这些重大变化。要了解更多信息,请查阅Flutter的重大变更政策。
贡献
Flutter 仓库的优先级和分类
Triage updates 分类更新
在过去的几个月里,我们采用了一套新的优先级定义(P0-P3)。这使我们更符合大多数其他开源项目使用的定义,并简化了我们在决定有多重要的错误时所需做出的决策 - 现在我们只有4个优先级,而不是7个。希望这也能帮助我们更有效地与那些提交错误报告并想知道何时会修复问题的人进行沟通!
我们还为我们的团队引入了一种新的分流方案,希望能够减少问题被忽视的可能性。如果您在我们的问题数据库中活跃,您可能会看到我们的新机器人进行评论并添加或删除标签。
这个机器人还与我们的Discord集成,帮助我们及时了解GitHub上发生的事情。我们希望它能在长期内提高我们的工作效率,但在我们适应这个新系统的过程中,请耐心等待!
结论
在我们即将结束这个公告时,我想要承认,如果没有我们伟大社区的努力,我们今天的成就是不可能的!
要查看此版本中包含的所有PR的完整列表,请查看此版本的发布说明和更改日志部分。
docs.flutter.dev/release/rel...
Flutter 3.13 今天已经发布稳定版本,其中包含了 Dart 3.1。要开始使用这些最新的更新,只需要 flutter upgrade
。
感谢阅读本文
如果我有什么错?请在评论中让我知道。我很乐意改进。
© 猫哥 ducafecat.com
end