AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

你的 Flutter 应用该考虑迁移代码了:Dart 3 将在 2023 年成为 100% 健全的空安全语言

  • 2022-12-12
    北京
  • 本文字数:2738 字

    阅读完需:约 9 分钟

你的Flutter应用该考虑迁移代码了:Dart 3将在2023年成为100%健全的空安全语言

谷歌 Dart 语言即将告别 null 值,开发者们必须在 Dart 3 正式到来之前调整自己的代码。

 

根据计划,在 Dart 编程语言的第三个主要版本于 2023 年年中首度亮相时,将不允许在非必要位置使用 null 值。

 

在该上下文中,null 代表一个赋值,用于表示不存在值或引用的对象。Null 引用最早可以追溯到 1964 年左右,当时英国计算机科学家 Tony Hoare 在 ALGOL 语言家族中引入了这个概念。他认为这是个“价值十亿美元的错误”,这里指的是修复此错误将要耗费的时间和金钱总值。这个判断相当精准,毕竟时至今日 null 仍然相当令人头痛。

 

从 2.12 版本开始,Dart 逐渐获得了健全的 null 安全性支持——一种防止对被设定为 null 的变量进行错误访问的方式。虽然出手修复,但 Dart 仍然保留了不加 null 安全(或部分 null 安全)保护直接运行代码的模式。

 

但从 Dart 3 开始,这些非最优解将彻底消失。

 

来自谷歌的编程语言

 

Dart 是一种面向对象、带垃圾收集的类 C 语言。维基百科的定义是:“Dart 是谷歌开发的一种通用编程语言,后被 Ecma 认定为标准(ECMA-408)。它被用于构建 Web、服务器、桌面和移动应用程序。”

 

在 2011 年 10 月 10 日的 GOTO 大会上,谷歌的两位工程师发布了“Dart”,旨在帮助开发者构建 Web 应用程序。

 

Dart 1.0 于 2013 年 11 月 14 日发布,曾经踌躇满志地想要取代 JavaScript 成为 Web 开发的首选语言。然而不久后,谷歌放弃了这个想法。因为 Dart 不仅仅在语言本身,包括它的整个生态圈,都比 JavaScript 落后了一大截。Dart 开发团队转而求其次,在可以被编译成 JavaScript 的同时,Dart 在 2.0 版本中也针对 Web 和移动客户端开发进行了独特优化,从而能让它更好地满足客户端开发人员的需求。

 

在谷歌内部, AdWords、AdSense 和 Fiber 项目团队都把 Dart 融入他们的前端应用开发。而随着跨平台移动 UI 框架 Flutter 的走红,作为 Flutter 的御用开发语言,Dart 也一时名声大噪。

 

与往常一样,来自谷歌的所有事物都能引发科技产业的极大兴趣,因此多年来,已经有不少其他公司用 Dart 来构建自己的关键性应用程序。

 

根据 Stack Overflow 开展的 2022 年开发者调查,Dart 目前在编程语言领域的流行度排名第 16 位。在近 72000 名受访者 2 中,约有 6.54%正在使用 Dart;相比之下,9.16%的受访者正在使用 Kotlin(第 15 位),9.32%在使用 Rust(第 14 名),11.15%的人在使用 Go(第 13 名)。苹果的 Swift 编程语言排在第 19 位,占比 4.91%。在全部受访者当中,应用最广的编程语言是 JavaScript,这位冠军的覆盖率达到了惊人的 65.36%。

 

让 Dart 成为更安全的编程语言

 

不少现代编程语言都支持 null 安全(也称空安全),解决的是 null 引用的问题。Tony Hoare 曾将其称为一个价值十亿美元的错误:“这导致了无数的错误、漏洞和系统崩溃,在过去四十年间造成了价值十亿美元的痛苦和损失。”

 

为了解决这个问题,Swift、C#和 Kotlin 等语言开始支持一种类型系统,开发者可以在其中将变量声明为非 null(永远不能保存为 null 值)或可 null(可以保存为 null 值)。这个类型系统可以与静态分析配合使用,检测是否将 null 赋值给了不可为 null 的变量。Dart 语言中的 null 安全支持也采取类似的模式,默认情况下变量不可为 null,仅在显式声明时才允许为 null。

 

在此基础上,Dart 更进一步,引入了健全 null 安全机制。这种健全机制保证,意味着不可为 null 的变量永远不会被赋予 null 值。

 

并不是每种语言的 null 安全实现都能如此稳定:Swift 在设计之初就考虑到了健全性;TypeScript 本质上并不健全,因为其底层类型系统允许将任何对象视为任意静态类型。所以在 TypeScript 当中,开发者其实仍可以将 null 值分配给非 null 变量。至于 C#这边,出于使用习惯和避免迁移所有当前代码的考虑,其中仍保留了几个例外。Kotlin 同样存在几个不合理的例外,部分原因是为了保持与 Java 的互操作性。举例来说,泛型类型可能导致声明包含非 null 元素的列表中流入 null 值。

 

Dart 与 Flutter 产品经理 Michael Thomsen 发布博文解释称,“我们的下个版本 Dart 3 将彻底完成通往绝对 null 安全语言的发展之旅。作为旅程的最后一步,我们将删除各个遗留 Dart 语言及 SDK 工件,不再支持非 null 安全条件下的运行模式。”

 

迁移到 Dart 3 的成本

 

但这一切也是有代价的。如果没有健全的 null 安全,由 2.12 或更早版本生成的带有 SDK 约束设置的 pubspec 文件(Dart 包的元数据)将根本无法兼容 Dart 3:“在 Dart 3 中,健全 null 安全将成为唯一受支持的模式。使用 2.12 及更早 SDK 约束版本的 pubspec 文件将无法在 Dart 3 或后续版本中正常解析。当约束设置为小于 2.12(例如 e.g. // @dart=2.9)时,任何包含语言标记的源代码都将报错。”

 

自 2.12 版本起,Dart 语言引入 null 安全已经有三年时间了,Dart 语言开发团队也意识到迁移现有 Dart 包和应用程序所造成的影响

 

为了降低迁移门槛,Dart 支持以三种方式运行应用程序代码,首先,可以在不启用 null 安全的前提下运行,也可以在启用部分 null 安全的混合模式下运行,最后可以在采取健全 null 安全的情况下运行。当代码 100%(包括所有依赖项)完成迁移时,即可实现健全 null 安全。如此一来,Dart 开发者就有时间一步步完成代码迁移。但请注意,支持多种模式也会增加维护开销和代码复杂度。

 

首先,Dart 开发者应当了解这三种模式选项。在阅读一段 Dart 代码时,首先应检查语言版本,据此判断类型会被默认为非 null、默认为可 null 或者二者兼有。其次,编译器和运行时若支持全部三种模式,则会拖慢 Dart SDK 的开发速度。这意味着新功能的添加成本和复杂度都会随之提升。

 

关于迁移的更多信息,谷歌也提供了参考迁移指南(https://dart.dev/null-safety/migration-guide)。

 

根据 Thomsen 的解释,约有 85%的 Flutter 代码(用 Dart 编写而成)能够直接支持健全 null 安全。而对于余下的 15%应用程序和软件包,开发者们必须在 Dart 3 正式到来之前调整自己的代码(please migrate before Dart 3 ships)

 

大型代码库的迁移可能需要一些时间。目前,德国汽车制造商宝马公司最近刚刚对其 MyBMW 应用进行了一轮 null 安全代码修订。这是一款由约 300 人开发者团队用 Flutter 构建的大规模应用程序。宝马公司移动应用开发主管 Christian Schmid 表示,“虽然对于像 MyBMW 应用这样的大型代码库来说,null 安全迁移工作并非易事,但谷歌提供的工具确实在迁移中给了我们很大帮助。在迁移完成之后,我们终于得到了一套更不容易出错的代码库。”

 

在 Dart 3 发布之后,该语言的下一个重要里程碑可能是支持将 Dart 代码编译为 Wasm。如此一来,Flutter Web 应用程序就能在浏览器中以本机代码的形式运行。当然,这项工作需要 W3C 和浏览器开发商合作,通过 WasmGC 扩展让 Wasm 能够支持各类垃圾收集语言(包括 Dart)。

 

参考资料:

https://medium.com/dartlang/the-road-to-dart-3-afdd580fbefa

https://www.theregister.com/2022/12/09/google_dart_null_safety/

2022-12-12 15:5522716

评论

发布
暂无评论
发现更多内容

月薪60k,仍无人问津,腾讯阿里到底有多缺这类程序员,Android软件开发面试题

android 程序员 移动开发

某Android程序员哀叹:自己薪资远远超过了能力,想跳槽又怕外面接不住

android 程序员 移动开发

模板方法模式,flutter刷新机制

android 程序员 移动开发

毕业6年,技术人的不惑之路,移动app开发工具

android 程序员 移动开发

求职注意事项:Android面试中不可犯的这些“九大失误,Android常用面试

android 程序员 移动开发

支付宝 App 构建优化解析:Android 包大小极致压缩(1),阿里P8亲自讲解

android 程序员 移动开发

数据结构(一), BST 二叉搜索树,高级程序员面试题

android 程序员 移动开发

数据结构算法---红黑树,这可能是我看过红黑树讲的最好的文章。

android 程序员 移动开发

数据结构与算法回顾-1:算法的度量和基本数据结构,近期有面试的必看

android 程序员 移动开发

是让人-提神醒脑-的-MVP、MVVM-关系精讲!,2021最新Android开发面试解答

android 程序员 移动开发

正则表达式基础,记得把每一次面试当做经验积累

android 程序员 移动开发

毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!

android 程序员 移动开发

最新Android面试题整理,移动端h5页面适配

android 程序员 移动开发

有效治理 BadTokenException,flutter安装androidsdk

android 程序员 移动开发

本想着只是蹭一蹭,没想到真的进去了,flutter下拉刷新样式

android 程序员 移动开发

毕业3年,我是如何从年薪10W的拖拽工程师成为30W资深Android开发者!(1)

android 程序员 移动开发

文件数据储存之内部储存,移动端开发技术创新

android 程序员 移动开发

新手必看,避免踩雷---一篇文带你吃透Android开发的所有必备考点,轻松拿offer

android 程序员 移动开发

普通Android码农,该如何逆袭月薪-5W-的移动端架构师?

android 程序员 移动开发

最新阿里P7技术体系,Android开发突破50W年薪,kotlin匿名内部类this

android 程序员 移动开发

本来只想试试水,没想到5面后还真进了字节!,Android程序员如何通过跳槽薪资翻倍

android 程序员 移动开发

支付宝 App 构建优化解析:Android 包大小极致压缩,android界面开发实验报告

android 程序员 移动开发

数据结构(一), BST 二叉搜索树(1),app可视化开发工具

android 程序员 移动开发

新来的小师妹问我:哥,有哪些是新手程序员不知道的小技巧

android 程序员 移动开发

最新字节跳动技术五面(刚拿Offer):一面(1),高级UI都没弄明白凭什么拿高薪

android 程序员 移动开发

最新字节跳动技术五面(刚拿Offer):一面,androidrom开发面试题

android 程序员 移动开发

有幸在GitHub上get到标星11k的面试笔记,让我成功入职美团Android开发岗

android 程序员 移动开发

横向对比Jetpack、RxJava、Glide框架中对组件生命周期Lifecycle感知原理

android 程序员 移动开发

新鲜出炉的Android“面筋”,kotlininline函数

android 程序员 移动开发

未来 Android 开发的从业方向,android开发的基础知识

android 程序员 移动开发

某一线互联网大厂内部超高质量Flutter+Kotlin笔记!技术与实战篇

android 程序员 移动开发

你的Flutter应用该考虑迁移代码了:Dart 3将在2023年成为100%健全的空安全语言_移动_Tina_InfoQ精选文章