在過去的四年里 Dart 已經(jīng)發(fā)展成為一門高效谣蠢、可移植的現(xiàn)代化語言,而下一個(gè)版本 Dart 3 將達(dá)到可靠的 null 安全語言的最后一步垢乙。
作為 null safety 的最后一步锨咙,本次將刪除幾個(gè)歷史 Dart 和 SDK artifacts,包括刪除對(duì) running without sound null safety 的支持追逮。
如今許多現(xiàn)代編程語言都支持 null safety 酪刀,比如 Swift、C# 和 Kotlin 等語言钮孵,可以在其中將變量聲明為非空(永遠(yuǎn)不能保持空值)或可為空(可以保存一個(gè)值或 null)的情況骂倘,這些類型系統(tǒng)會(huì)和靜態(tài)分析結(jié)合使用,以檢測將 null 賦值給不可為 null 的變量巴席。
同樣稠茂,Dart 語言中的 null 安全支持默認(rèn)情況下使變量不可為 null,并且僅在顯式聲明時(shí)才允許 null。
在 Dart 3 中睬关,所有 Dart 代碼都將使用健全的空安全
自從 Dart 2.12 引入空安全到現(xiàn)在已經(jīng)三年了诱担,在此期間開發(fā)者可以在沒有 null safety 的情況下運(yùn)行,也可以在具有部分 null safety 的混合模式下運(yùn)行电爹,也可以在具有完全健全的 null safety 的情況下運(yùn)行蔫仙。
當(dāng) 100% 的代碼(包括所有依賴項(xiàng))已遷移到 null safety 時(shí),就會(huì)出現(xiàn)完全可靠的空安全支持丐箩,在此期間 Dart 開發(fā)人員有時(shí)間一步一步地遷移現(xiàn)有代碼摇邦,但是支持多種模式會(huì)增加開銷和復(fù)雜性。
首先屎勘,Dart 開發(fā)人員需要了解以上三種模式施籍,每當(dāng)閱讀一段 Dart 代碼時(shí),就必須檢查語言版本以查看類型是否默認(rèn)為非空概漱、默認(rèn)可為空或它們的某種組合丑慎。
其次,在我們的編譯器和運(yùn)行時(shí)支持所有三種模式會(huì)減慢 Dart SDK 的發(fā)展速度瓤摧,這種支持增加了添加新功能的成本和復(fù)雜性竿裂。
從在 Dart 3 開始,正如之前 2.18 里提前宣布的那樣照弥,sound null safety 將是唯一受支持的模式腻异,**小于 2.12 的 SDK 約束的 Pubspec 文件將在 Dart 3 及更高版本中停止解析。
當(dāng)開發(fā)者將依賴約束設(shè)置為小于 2.12(例如
// @dart=2.9
)時(shí)这揣,任何包含語言標(biāo)記的源代碼都將失效悔常。
根據(jù)目前的觀測,我們相信此時(shí)大約 85% 的 flutter run 執(zhí)行都使用了空安全给赞,如果你還在剩余的 15% 中这嚣,那請?jiān)?Dart 3 發(fā)布之前遷移,預(yù)計(jì)在 2023 年年中左右塞俱。
Breaking 和 API 更改
除了 null 安全更改之外姐帚,Dart 3 還進(jìn)行了一些其他更改,以刪除 Dart 和核心庫 API 中的一些歷史 artifacts障涯,這些更改包括:
這些更改對(duì)遷移到使用 null 安全的代碼的影響很小,當(dāng)?shù)谝粋€(gè) Dart 3 alpha 版本發(fā)布時(shí)唯蝶,開發(fā)者可以快速測試這些較小的 Breaking九秀。
Dart 3 的新特性和功能
Dart 3 也有望包含許多新功能,包括改進(jìn)與其他編程語言的交互能力和新的語言特性粘我, 這部分內(nèi)容將在2023 年 1 月 25 日的 Flutter Forward 中詳細(xì)討論鼓蜒。
例如有被稱為 patterns 的語言特性痹换,patterns 讓 Dart 語言更具表現(xiàn)力,增加了對(duì)更多結(jié)構(gòu)化數(shù)據(jù)的支持都弹,并使用代數(shù)數(shù)據(jù)類型實(shí)現(xiàn)了更實(shí)用的風(fēng)格网杆。
以下代碼顯示了在一個(gè)函數(shù)上使用多個(gè)返回值的示例渐溶,以及將這些返回值解構(gòu)為單個(gè)變量的能力:
// 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 團(tuán)隊(duì)正在努力支持將 Dart 代碼編譯為 WebAssembly ( Wasm )框杜,Wasm 能讓 Flutter Web 在瀏覽器中作為完整的原生代碼運(yùn)行浦楣。
這是一項(xiàng)艱巨的任務(wù),除了更新 Dart 編譯器之外還需要很多額外的工作咪辱。它需要與 W3C 和瀏覽器供應(yīng)商合作振劳,通過 WasmGC 擴(kuò)展在 Wasm 中添加對(duì)垃圾收集語言的支持。
其次 Dart 團(tuán)隊(duì)正在研究 macros 啟用靜態(tài)元編程油狂,這種強(qiáng)大的機(jī)制允許一段代碼(宏)在程序編譯期間修改和擴(kuò)展程序的源代碼历恐,例如可以減少反序列化 JSON 或創(chuàng)建數(shù)據(jù)類所需的樣板文件。
Dart 3 發(fā)布路線
接下來选调,Dart 3 將在一系列里程碑中陸續(xù)推出夹供,目前的期望圍繞這些日期
-
2023 年 1 月/2 月左右:Dart 3 alpha 發(fā)布灵份,它將專注于啟用早期的 Dart 3 兼容性測試仁堪,目標(biāo)是讓大家能夠運(yùn)行靜態(tài)分析 (
dart analyze
/flutter analyze
),理論上通過 Dart 3 alpha 靜態(tài)分析的應(yīng)用或包都可以支持 Dart 3 穩(wěn)定版填渠。 - 2023 年 3 月/4 月左右:Dart 3 測試版發(fā)布弦聂,此版本預(yù)覽了 Dart 3 中的新功能,開發(fā)者可以使用它來試驗(yàn)新功能并就問題或改進(jìn)建議提供反饋氛什。
- 2023 年年中左右:Dart 3 穩(wěn)定版發(fā)布莺葫,健全的空安全將成為唯一支持的模式。
總結(jié)
Dart 3 版本計(jì)劃于 2023 年年中左右發(fā)布枪眉,它將包含幾項(xiàng)重大更改捺檬,其中主要是在沒有健全的空安全的情況下你的代碼將停止運(yùn)行,計(jì)劃在 2023 年 1 月或 2 月左右準(zhǔn)備好 Dart 3 alpha 版本贸铜,可以將其用于 Dart 3 兼容性測試堡纬。
在此期間你可以準(zhǔn)備:
- 完成任何未完成的空安全遷移
- 驗(yàn)證代碼未使用任何已棄用的 API
- 運(yùn)行
dart fix
。
Dart 3 還將包含幾個(gè)新的強(qiáng)大功能蒿秦,例如 patterns 烤镐,計(jì)劃是希望在春季發(fā)布 Dart 3 beta 版,展示所有新功能棍鳖,敬請期待~
作者:戀貓de小郭
鏈接:https://juejin.cn/post/7174985128799076389