flutter的下一步,dart3重大变更即将在2023到来(代码片段)

上马定江山 上马定江山     2022-12-16     300

关键词:

在过去的四年里 Dart 已经发展成为一门高效、可移植的现代化语言,而下一个版本 Dart 3 将达到可靠的 null 安全语言的最后一步。

作为 null safety 的最后一步,本次将删除几个历史 Dart 和 SDK artifacts,包括删除对 running without sound null safety 的支持

如今许多现代编程语言都支持 null safety ,比如 Swift、C# 和 Kotlin 等语言,可以在其中将变量声明为非空永远不能保持空值)或可为(可以保存一个值或 null)的情况,这些类型系统会和静态分析结合使用,以检测将 null 赋值给不可为 null 的变量。

同样,Dart 语言中的 null 安全支持默认情况下使变量不可为 null,并且仅在显式声明时才允许 null。

在 Dart 3 中,所有 Dart 代码都将使用健全的空安全

自从 Dart 2.12 引入空安全到现在已经三年了,在此期间开发者可以在没有 null safety 的情况下运行,也可以在具有部分 null safety 的混合模式下运行,也可以在具有完全健全的 null safety 的情况下运行。

当 100% 的代码(包括所有依赖项)已迁移到 null safety 时,就会出现完全可靠的空安全支持,在此期间 Dart 开发人员有时间一步一步地迁移现有代码,但是支持多种模式会增加开销和复杂性。

首先,Dart 开发人员需要了解以上三种模式,每当阅读一段 Dart 代码时,就必须检查语言版本以查看类型是否默认为非空、默认可为空或它们的某种组合。

其次,在我们的编译器和运行时支持所有三种模式会减慢 Dart SDK 的发展速度,这种支持增加了添加新功能的成本和复杂性

从在 Dart 3 开始,正如之前 2.18 里提前宣布的那样,sound null safety 将是唯一受支持的模式,**小于 2.12 的 SDK 约束的 Pubspec 文件将在 Dart 3 及更高版本中停止解析。

当开发者将依赖约束设置为小于 2.12(例如// @dart=2.9)时,任何包含语言标记的源代码都将失效。

根据目前的观测,我们相信此时大约 85% 的 flutter run 执行都使用了空安全,如果你还在剩余的 15% 中,那请在 Dart 3 发布之前迁移,预计在 2023 年年中左右

Breaking 和 API 更改

除了 null 安全更改之外,Dart 3 还进行了一些其他更改,以删除 Dart 和核心库 API 中的一些历史 artifacts,这些更改包括:

  • 删除已停用的核心库 API ( #49529 )
  • 删除默认参数值的历史语法 ( #2357 )
  • 要求明确的 tear-offs ( ##2399 )。

这些更改对迁移到使用 null 安全的代码的影响很小,当第一个 Dart 3 alpha 版本发布时,开发者可以快速测试这些较小的 Breaking。

Dart 3 的新特性和功能

Dart 3 也有望包含许多新功能,包括改进与其他编程语言的交互能力和新的语言特性, 这部分内容将在2023 年 1 月 25 日的 Flutter Forward 中详细讨论。

例如有被称为 patterns 的语言特性,patterns 让 Dart 语言更具表现力,增加了对更多结构化数据的支持,并使用代数数据类型实现了更实用的风格。

以下代码显示了在一个函数上使用多个返回值的示例,以及将这些返回值解构为单个变量的能力:

// A function which returns a record -- in this case a pair of two doubles:
(double x, double y) getLocation(String name) 
 if (name == 'Aarhus') 
   return (56.1629, 10.2039);
 else 
  ...


​
// Deconstructing the returned record back into individual variables:
void main(List<String> arguments) 
 final (lat, long) = getLocation('Aarhus');
 print('Current location: $lat, $long');

​
// You can also define a hierarchy of classes, and then pattern match on those:
sealed class Shape 
 double calculateArea();

​
class Square implements Shape 
 final double length;
 Square(this.length);
 double calculateArea() => length * length;

​
class Circle implements Shape 
 final double radius;
...

​
double calculateArea(Shape shape) => switch (shape) 
 Square(length: var l) => l * l,
 Circle(radius: var r) => math.pi * r * r
;

Beyond Dart 3

目前除了 Dart 3 还有大量并行的潜在的新功能在处理,首先,正如去年提到的, Dart 团队正在努力支持将 Dart 代码编译为 WebAssembly ( Wasm ),Wasm 能让 Flutter Web 在浏览器中作为完整的原生代码运行。

这是一项艰巨的任务,除了更新 Dart 编译器之外还需要很多额外的工作。它需要与 W3C 和浏览器供应商合作,通过 WasmGC 扩展在 Wasm 中添加对垃圾收集语言的支持。

其次 Dart 团队正在研究 macros 启用静态元编程,这种强大的机制允许一段代码(宏)在程序编译期间修改和扩展程序的源代码,例如可以减少反序列化 JSON 或创建数据类所需的样板文件

Dart 3 发布路线

接下来,Dart 3 将在一系列里程碑中陆续推出,目前的期望围绕这些日期

  • 2023 年 1 月/2 月左右:Dart 3 alpha 发布,它将专注于启用早期的 Dart 3 兼容性测试,目标是让大家能够运行静态分析 ( dart analyze/ flutter analyze),理论上通过 Dart 3 alpha 静态分析的应用或包都可以支持 Dart 3 稳定版。
  • 2023 年 3 月/4 月左右:Dart 3 测试版发布,此版本预览了 Dart 3 中的新功能,开发者可以使用它来试验新功能并就问题或改进建议提供反馈。
  • 2023 年年中左右:Dart 3 稳定版发布,健全的空安全将成为唯一支持的模式。

总结

Dart 3 版本计划于 2023 年年中左右发布,它将包含几项重大更改,其中主要是在没有健全的空安全的情况下你的代码将停止运行,计划在 2023 年 1 月或 2 月左右准备好 Dart 3 alpha 版本,可以将其用于 Dart 3 兼容性测试

在此期间你可以准备:

  • 完成任何未完成的空安全迁移
  • 验证代码未使用任何已弃用的 API
  • 运行 dart fix

Dart 3 还将包含几个新的强大功能,例如 patterns ,计划是希望在春季发布 Dart 3 beta 版,展示所有新功能,敬请期待~

作者:恋猫de小郭
链接:https://juejin.cn/post/7174985128799076389

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。


相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

二、源码解析合集


三、开源框架合集


欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓

如何保证在开始IntegrationFlow 的下一步之前完成该工作?

】如何保证在开始IntegrationFlow的下一步之前完成该工作?【英文标题】:HowtoguaranteethatjobisfinishedbeforestartingthenextstepofIntegrationFlow?【发布时间】:2020-01-0904:03:18【问题描述】:我有以下流声明:returnflow->flow.handle(myHandler).handle(s... 查看详情

找到能立刻开始的下一步行动|进击

...出来的行动序列,第一个要做的行动,就是我们这里所说的下一步行动。当你完成了任务到行动的拆分,每个任务就都对 查看详情

如何从祖先中获得 JQuery 的下一步

】如何从祖先中获得JQuery的下一步【英文标题】:HowtogetnextwithJQueryoutofancestor【发布时间】:2012-05-1014:04:35【问题描述】:我想要当前“a”的下一个“a”元素。当电流为2,3,4时,我用$(\'a.current\').nextAll(\'a\')捕获3,4,5但当电流为5... 查看详情

查找此异常原因的下一步是啥?

】查找此异常原因的下一步是啥?【英文标题】:Whataremynextstepsonfindingthecauseofthisexception?查找此异常原因的下一步是什么?【发布时间】:2015-08-3108:18:54【问题描述】:我对Eclipse、Java和Android编程相当陌生。我已经接管了一个And... 查看详情

从 appengine 迁移到完整 django 的下一步是啥?

】从appengine迁移到完整django的下一步是啥?【英文标题】:What\'sthenextstepsformovingfromappenginetofulldjango?从appengine迁移到完整django的下一步是什么?【发布时间】:2011-06-0517:19:46【问题描述】:我是编程新手,我一直在使用appengine来... 查看详情

Ninja 表单:多部分表单 - 字段单击的下一步 (jQuery)

】Ninja表单:多部分表单-字段单击的下一步(jQuery)【英文标题】:NinjaForms:MultiPartForms-NextStepOnFieldClick(jQuery)【发布时间】:2019-02-0309:52:44【问题描述】:我在使用NinjaForms+MultiStep表单插件实现jQuery点击事件时遇到了麻烦。目标是... 查看详情

c# windows form,部署前的下一步是啥?

】c#windowsform,部署前的下一步是啥?【英文标题】:c#windowsform,Whatisnextstepbeforedeployment?c#windowsform,部署前的下一步是什么?【发布时间】:2020-08-1416:21:55【问题描述】:刚刚在sql管理Studio中使用数据库完成了我的诊所Winforms程... 查看详情

如何等待http请求在处理到angular 7中的下一步之前获得响应[重复]

】如何等待http请求在处理到angular7中的下一步之前获得响应[重复]【英文标题】:Howtowaitforhttprequesttogetresponsebeforeitprocesstonextstepinangular7[duplicate]【发布时间】:2019-06-2923:13:17【问题描述】:我正在尝试构建应用程序,我正在发送... 查看详情

Ruby 中的下一步是啥?

】Ruby中的下一步是啥?【英文标题】:WhatisinvalidnextinRuby?Ruby中的下一步是什么?【发布时间】:2013-11-0212:33:27【问题描述】:以下代码有效:collection.eachdo|i|beginnextifi>10i+=1rescueputs"couldnotprocess#i"endend但是,当我们重构时:colle... 查看详情

RestKit 中 RKManagedObject 的下一步是啥

】RestKit中RKManagedObject的下一步是啥【英文标题】:what\'sthenextofRKManagedObjectinRestKitRestKit中RKManagedObject的下一步是什么【发布时间】:2015-09-1914:41:32【问题描述】:刚看了github上的tutorial,发现了一些关于CoreData的对象方法,比如fe... 查看详情

使用分析函数的下一步操作

】使用分析函数的下一步操作【英文标题】:Nextactionusinganalyticfunctions【发布时间】:2013-04-3013:20:38【问题描述】:为了进行同期群分析,我正在尝试获取每个客户的下一步操作(取消订阅、升级、降级...)我有一个包含以下数... 查看详情

祝福eric的下一段旅程,flutter3.3现已发布

Flutter团队及社区成员们在美丽的城市挪威奥斯陆向您发来问候,我们正在此参加社区举办的FlutterVikings活动,这是一个为期两天的开发技术交流盛会,虽然线下门票已经售罄,但您还可以通过在线方式查看本次会... 查看详情

祝福eric的下一段旅程,flutter3.3现已发布

Flutter团队及社区成员们在美丽的城市挪威奥斯陆向您发来问候,我们正在此参加社区举办的FlutterVikings活动,这是一个为期两天的开发技术交流盛会,虽然线下门票已经售罄,但您还可以通过在线方式查看本次会... 查看详情

使用 PageViewController 上的下一步按钮

】使用PageViewController上的下一步按钮【英文标题】:UsingnextbuttononPageViewController【发布时间】:2019-05-1913:47:01【问题描述】:我有一个pageViewcontroller,它运行良好,我可以左右滚动,但现在我希望能够在下一页旁边添加按钮和使... 查看详情

如何使用javascript记录链接点击,然后自动点击Qualtrics中的下一步按钮?

...如何使用javascript记录链接点击,然后自动点击Qualtrics中的下一步按钮?【英文标题】:HowtorecordalinkclickandthenautomaticallyclicknextbuttoninQualtricswithjavascript?【发布时间】:2021-09-2201:11:02【问题描述】:我正在Qualtrics进行一项调查。在... 查看详情

如何组合两个结果并将其传递到 apache-beam 管道中的下一步

】如何组合两个结果并将其传递到apache-beam管道中的下一步【英文标题】:Howtocombinetworesultsandpipeittonextstepinapache-beampipeline【发布时间】:2020-11-1222:35:09【问题描述】:见下面代码sn-p,我希望["metric1","metric2"]成为... 查看详情

电脑怎么修改账户密码

...方的更改。输入原有的密码。5、输入原有的密码,点击下一步。点击下一步。6、设置新的密码及密码提示后,点击下一步,即可完成更改。这样我们的电脑密码就修改成功了参考技术A如果本机帐户有设置密码并想要变更时,可... 查看详情

嵌入式存储的下一步:stt-mram

MRAM,即磁阻式随机访问存储器的简称,兼备SRAM的高速读写性能与闪存存储器的非易失性。STT-MRAM是通过自旋电流实现信息写入的一种新型MARM,属于MRAM的二代产品,解决了MRAM写入信息存在的问题。STT-MRAM存储单元... 查看详情