Flutter 的下一步, Dart 3 重大變更即將在 2023 到來

語言: CN / TW / HK

theme: smartblue

原文連結 https://medium.com/dartlang/the-road-to-dart-3-afdd580fbefa

在過去的四年裡 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 版,展示所有新功能,敬請期待~