Dart Sound Null Safety 概览

Dart Sound Null Safety 概览

Dart 2.12, Flutter 2 特性

Dart SDK 约束:

environment:
  sdk: ">=2.12.0 <3.0.0"

介绍

在对空指针调用方法的时候,Dart 会抛出 NoSuchMethodError 的异常。

// Without null safety:
bool isEmpty(String string) => string.length == 0;

main() {
  isEmpty(null);
}

因为 null 本身在 Dart 中也是个实例,是 Null 类的实例, 而 Null 类中并无此 length getter 方法所以抛异常

class Null {
  factory Null._uninstantiable() {
    throw UnsupportedError('class Null cannot be instantiated');
  }

  external int get hashCode;

  /** Returns the string `"null"`. */
  String toString() => "null";
}

作用

  1. 能够让在你在开发阶段就可以捕获到由 null 而引发的 app 崩溃错误。
  2. 让程序更快更小,因为不需要对 non-nullable 变量进行判断是否为 null 了。

特性

  • 默认变量的声明值都不能为 null, 即: non-nullable
  • 在变量的数据类型声明后加 ? 表示该变量可以有值也可以为 null, 即 nullable
    int? aNullableInt = null;
    

核心设计原则

  1. 默认是 non-nullable: 如果没有指定变量为 nullable,默认即为 non-nullable。
  2. 逐步迁移: 在工程中可以同时存在空安全和非空安全混编的代码,并提供工具逐步迁移。
  3. 完全符合健壮性: 只要类型系统确定该变量是 non-nullable,即该变量永远都不会为 null, 并开启了编译器优化,拥有更小的二进制以及更快的运行速度。

操作符

null-safety相关操作符 ! (assertion operator)、?、late, 处理 nullable 的操作符 if、??、?.

late 关键字用于当无法对 non-nullable 立即赋值的时候,可以用该关键字延迟赋值, 注意 late 关键字和 fianl 是可以共存的。以下三点

  1. 不需要立即赋值。
  2. 可以稍后赋值
  3. 在访问之前确保赋值了。(没赋值即访问抛异常 LateInitializationError)

late 除了可以延迟赋值外,还可以使成员方法懒加载,这对于读取大量耗时资源的时候十分有效,因为这些资源有可能用户不会用到,但是如果一开始就把这些资源就读取进来是没必要的,想做到需要读取的时候再进行读取。

?. 操作符号在 null-safety 有短路的功能,例如 person?.dog.age 如果 person 为 null, 那么整条表达式就直接返回 null 了。

request

在 null-safety 当中,命名参数 non-nullable 的类型必须要有默认值或是使用 request 关键字来修饰,也就是对于 non-nullable 来说它必须要有值。

List、Set、Map 中的 null-safety

在使用集合的时候需要考虑哪一部分是可以为 null 的。

List、 Set

image.png

Map

Map 情况与 List、Set类似, 但有个例外, 当通过 Key 拿 value 的时候,该 value 可能会为 null, 也就是说 map['key'] 返回的是一个 nullable

image.png

非健全的空安全

Dart 提供两种模式:

  1. 混合开发: 为了更加灵活,如果工程中有些库支持了 null-safety 而有些库没有,也是支持这种混合开发,称之为非健全的空安全(unsound null safety)。但当 safe 与 unsafe 的库互相混入无法在运行时保证完全健全,也就是说还是可能会报 NoSuchMethodError 相关错误。

    直接升级到 Flutter 2.0 而没有迁移 App 就是 unsound null safety。


    image.png
  1. 完全健全(建议):当所有的依赖所有的库全部都迁入 null-safety,此时即为健全的空安全。能够保证 null 的问题并且编译器可以进行优化使得程序更小更快。

    image.png

迁移

迁移 app/package 前提:

  1. 等待: 等待工程中所有依赖都已经迁移至了 null-safety。
  2. 迁移: 使用迁移工具。
  3. 静态分析: 静态分析暴露出迁移后代码存在的问题,并做修复。
  4. 测试: 测试你的修改是可以运行的。

通过在 IDE 上增加一些 hit 来让工具实现预期的更改。

image.png

迁移指南
迁移视频

教程

DartPad 练习
Null safety feature tour(入门)
Understanding null safety(深入)

资料

DartPad 练习
参考资料
迁移指南
迁移视频
pub 迁移情况统计
Dart and the performance benefits of sound types
the known null safety issues fro Dart
the known null safety issues fro flutter

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容