Dart Sound Null Safety 概覽

Dart Sound Null Safety 概覽

Dart 2.12, Flutter 2 特性

Dart SDK 約束:

environment:
  sdk: ">=2.12.0 <3.0.0"

介紹

在對空指針調(diào)用方法的時候肴掷,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. 能夠讓在你在開發(fā)階段就可以捕獲到由 null 而引發(fā)的 app 崩潰錯誤呆瞻。
  2. 讓程序更快更小台夺,因為不需要對 non-nullable 變量進行判斷是否為 null 了。

特性

  • 默認變量的聲明值都不能為 null, 即: non-nullable痴脾。
  • 在變量的數(shù)據(jù)類型聲明后加 ? 表示該變量可以有值也可以為 null, 即 nullable颤介。
    int? aNullableInt = null;
    

核心設(shè)計原則

  1. 默認是 non-nullable: 如果沒有指定變量為 nullable,默認即為 non-nullable赞赖。
  2. 逐步遷移: 在工程中可以同時存在空安全和非空安全混編的代碼滚朵,并提供工具逐步遷移。
  3. 完全符合健壯性: 只要類型系統(tǒng)確定該變量是 non-nullable前域,即該變量永遠都不會為 null, 并開啟了編譯器優(yōu)化辕近,擁有更小的二進制以及更快的運行速度。

操作符

null-safety相關(guān)操作符 ! (assertion operator)话侄、亏推?、late, 處理 nullable 的操作符 if年堆、??吞杭、?.

late 關(guān)鍵字用于當(dāng)無法對 non-nullable 立即賦值的時候,可以用該關(guān)鍵字延遲賦值, 注意 late 關(guān)鍵字和 fianl 是可以共存的变丧。以下三點

  1. 不需要立即賦值芽狗。
  2. 可以稍后賦值
  3. 在訪問之前確保賦值了。(沒賦值即訪問拋異常 LateInitializationError)

late 除了可以延遲賦值外痒蓬,還可以使成員方法懶加載,這對于讀取大量耗時資源的時候十分有效童擎,因為這些資源有可能用戶不會用到,但是如果一開始就把這些資源就讀取進來是沒必要的攻晒,想做到需要讀取的時候再進行讀取顾复。

?. 操作符號在 null-safety 有短路的功能,例如 person?.dog.age 如果 person 為 null鲁捏, 那么整條表達式就直接返回 null 了芯砸。

request

在 null-safety 當(dāng)中,命名參數(shù) non-nullable 的類型必須要有默認值或是使用 request 關(guān)鍵字來修飾,也就是對于 non-nullable 來說它必須要有值给梅。

List假丧、Set、Map 中的 null-safety

在使用集合的時候需要考慮哪一部分是可以為 null 的动羽。

List包帚、 Set

image.png

Map

Map 情況與 List、Set類似, 但有個例外, 當(dāng)通過 Key 拿 value 的時候运吓,該 value 可能會為 null, 也就是說 map['key'] 返回的是一個 nullable

image.png

非健全的空安全

Dart 提供兩種模式:

  1. 混合開發(fā): 為了更加靈活渴邦,如果工程中有些庫支持了 null-safety 而有些庫沒有疯趟,也是支持這種混合開發(fā)躏仇,稱之為非健全的空安全(unsound null safety)。但當(dāng) safe 與 unsafe 的庫互相混入無法在運行時保證完全健全,也就是說還是可能會報 NoSuchMethodError 相關(guān)錯誤怀泊。

    直接升級到 Flutter 2.0 而沒有遷移 App 就是 unsound null safety霉赡。


    image.png
  1. 完全健全(建議):當(dāng)所有的依賴所有的庫全部都遷入 null-safety,此時即為健全的空安全。能夠保證 null 的問題并且編譯器可以進行優(yōu)化使得程序更小更快推励。

    image.png

遷移

遷移 app/package 前提:

  1. 等待: 等待工程中所有依賴都已經(jīng)遷移至了 null-safety。
  2. 遷移: 使用遷移工具。
  3. 靜態(tài)分析: 靜態(tài)分析暴露出遷移后代碼存在的問題纤垂,并做修復(fù)。
  4. 測試: 測試你的修改是可以運行的磷账。

通過在 IDE 上增加一些 hit 來讓工具實現(xiàn)預(yù)期的更改峭沦。

image.png

遷移指南
遷移視頻

教程

DartPad 練習(xí)
Null safety feature tour(入門)
Understanding null safety(深入)

資料

DartPad 練習(xí)
參考資料
遷移指南
遷移視頻
pub 遷移情況統(tǒng)計
Dart and the performance benefits of sound types
the known null safety issues fro Dart
the known null safety issues fro flutter

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逃糟,隨后出現(xiàn)的幾起案子吼鱼,更是在濱河造成了極大的恐慌,老刑警劉巖绰咽,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菇肃,死亡現(xiàn)場離奇詭異,居然都是意外死亡取募,警方通過查閱死者的電腦和手機琐谤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玩敏,“玉大人斗忌,你說我怎么就攤上這事⊥郏” “怎么了织阳?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砰粹。 經(jīng)常有香客問我唧躲,道長,這世上最難降的妖魔是什么伸眶? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任惊窖,我火速辦了婚禮,結(jié)果婚禮上厘贼,老公的妹妹穿的比我還像新娘界酒。我一直安慰自己,他們只是感情好嘴秸,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布毁欣。 她就那樣靜靜地躺著庇谆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凭疮。 梳的紋絲不亂的頭發(fā)上饭耳,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機與錄音执解,去河邊找鬼寞肖。 笑死,一個胖子當(dāng)著我的面吹牛衰腌,可吹牛的內(nèi)容都是我干的新蟆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼右蕊,長吁一口氣:“原來是場噩夢啊……” “哼琼稻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饶囚,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤帕翻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萝风,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘀掸,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年闹丐,在試婚紗的時候發(fā)現(xiàn)自己被綠了横殴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卿拴,死狀恐怖衫仑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堕花,我是刑警寧澤文狱,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站缘挽,受9級特大地震影響瞄崇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壕曼,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一苏研、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腮郊,春花似錦摹蘑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撒踪。三九已至,卻和暖如春大渤,著一層夾襖步出監(jiān)牢的瞬間制妄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工泵三, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耕捞,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓切黔,卻偏偏與公主長得像砸脊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纬霞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容