作者 / Michael Thomsen, Product Manager working on Dart and Flutter
我們?cè)?Google I/O 大會(huì)上發(fā)布了全新的 2.17 版 Dart SDK。此版本構(gòu)建于我們的核心主題之上,即領(lǐng)先的工作效率與平臺(tái)可移植性。Dart 2.17 帶來(lái)了新的語(yǔ)言特性,包括在枚舉中支持成員變量、改進(jìn)超類(lèi)參數(shù)繼承及提高命名參數(shù)的靈活性等。我們推出全新的主要版本 package:lints 來(lái)幫助大家根據(jù)最佳實(shí)踐檢查 Dart 代碼。同時(shí),我們還大幅更新了核心庫(kù)的 API 文檔,為其帶來(lái)了豐富的代碼示例。為了改善平臺(tái)集成效果,我們?cè)?Flutter 插件中提供了新的模版,以便使用 dart:ffi 與原生平臺(tái)進(jìn)行 C 語(yǔ)言的互操作,還開(kāi)始為 RISC-V 處理器提供實(shí)驗(yàn)性支持,以及為 macOS 和 Windows 可執(zhí)行文件提供簽名。
新語(yǔ)言特性助力工作效率提升
為了幫助開(kāi)發(fā)者提升工作效率,我們一直在改進(jìn) Dart 語(yǔ)言,為其添加新特性并持續(xù)改進(jìn)現(xiàn)有功能。Dart 2.17 新增對(duì)枚舉成員變量的支持,優(yōu)化在構(gòu)造函數(shù)中使用命名參數(shù)的方式,并使超類(lèi)參數(shù)的繼承更加便捷,減少了冗長(zhǎng)和重復(fù)的代碼。
在枚舉中支持成員變量
枚舉非常適合用來(lái)表示一組離散的狀態(tài)。例如,我們可以將水描述為 enum Water { frozen, lukewarm, boiling }。但是,如果我們想在 enum 上添加一些方法,例如,將每個(gè)狀態(tài)轉(zhuǎn)換為溫度,以及支持將 enum 轉(zhuǎn)換為 String,該怎么辦?或許我們可以使用擴(kuò)展方法來(lái)添加一個(gè) waterToTemp() 方法,但必須注意讓其與 enum 保持同步。對(duì)于 String 轉(zhuǎn)換,我們希望重寫(xiě) toString(),但這個(gè)做法在之前的版本不受支持。
Dart 2.17 中現(xiàn)已全面支持枚舉成員變量。因此,我們可以添加保存狀態(tài)的字段、設(shè)置狀態(tài)的構(gòu)造函數(shù)、具備功能的方法,甚至重寫(xiě)現(xiàn)有方法。許多開(kāi)發(fā)者對(duì)此功能一直有需求,這是我們語(yǔ)言問(wèn)題跟蹤專(zhuān)頁(yè)中投票排名第三的問(wèn)題:
再次以水為例,我們可以添加一個(gè)保存溫度的 int 字段,并添加一個(gè)接收 int 的默認(rèn)構(gòu)造函數(shù):
enum Water {
…
final int tempInFahrenheit;
const Water(this.tempInFahrenheit);
}
為了確保在創(chuàng)建 enum 時(shí)構(gòu)造函數(shù)被調(diào)用,我們需要為每一個(gè) enum 值進(jìn)行調(diào)用:
enum Water {
frozen(32),
lukewarm(100),
boiling(212);
…
}
要支持轉(zhuǎn)換為 String,我們只需重寫(xiě) enums 繼承自 Object 的 toString 方法:
@override
String toString() => "The $name water is $tempInFahrenheit F.";
這樣即可獲得一個(gè)可以輕松實(shí)例化的完整 enum,您可以在其上調(diào)用方法:
void main() {
print(Water.frozen); // Prints “The frozen water is 32 F.”
}
以下為這兩種方法的完整示例。不難看出,全新 Dart 2.17 版本的代碼更加易于閱讀和維護(hù)。
超類(lèi)初始化構(gòu)造
如果您的代碼存在類(lèi)繼承層次結(jié)構(gòu),常見(jiàn)模式是將一些構(gòu)造函數(shù)參數(shù)傳遞給超類(lèi)的構(gòu)造函數(shù)。為此,子類(lèi)需要 1) 在其構(gòu)造函數(shù)中列出每個(gè)參數(shù);2) 使用這些參數(shù)調(diào)用超類(lèi)的構(gòu)造函數(shù)。這樣會(huì)導(dǎo)致樣板代碼反復(fù)出現(xiàn),從而增加代碼的閱讀和維護(hù)難度。 在幾位 Dart 社區(qū)成員的幫助下,我們的改進(jìn)目標(biāo)得以實(shí)現(xiàn)。半年前,GitHub 用戶(hù) @roy-sianez 提交了一個(gè)相關(guān)的語(yǔ)言問(wèn)題。他的建議與 GitHub 用戶(hù) @apps-transround 之前提出的建議類(lèi)似:也許我們可以這樣解決問(wèn)題,即引入新的構(gòu)造方式,來(lái)表示超類(lèi)中已指定一個(gè)參數(shù)。我們認(rèn)為這個(gè)想法不錯(cuò),所以將其添加在 Dart 2.17 中。從下面的示例中不難看出,這尤其與 Flutter widget 代碼密切相關(guān)。實(shí)際上,在我們將這項(xiàng)新特性應(yīng)用到 Flutter 框架后,代碼總共減少了近兩千行!
在任意參數(shù)位置使用命名參數(shù)最后,我們改進(jìn)了調(diào)用某個(gè)方法時(shí)命名參數(shù)的使用方式。此前,命名參數(shù)只能出現(xiàn)在方法參數(shù)列表的最后。如果您希望讓位置參數(shù)靠后,從而提升代碼可讀性,這種限制就會(huì)令人感到非常煩惱。以下面 List
更多有關(guān)這三個(gè)特性的示例,請(qǐng)參閱我們更新的枚舉、超類(lèi)初始化構(gòu)造和命名參數(shù)示例代碼。
工作效率工具
在工作效率主題方面,我們對(duì)核心工具進(jìn)行了一些改進(jìn)。
在 Dart 2.14 中,我們引入了 package:lints,它可與 Dart 分析器一起工作,以幫助您避免編寫(xiě)出包含錯(cuò)誤的 Dart 代碼,并通過(guò)規(guī)范化的方式提升代碼審核效率。后來(lái)分析器中又新增了許多 Lint,我們對(duì)其進(jìn)行了仔細(xì)分類(lèi),并從中選擇了 10 條新的 Lint 用于所有 Dart 代碼,還有 2 條新的 Lint 專(zhuān)門(mén)用于 Flutter 代碼。其中一些 Lint 可確保 pubspec 文件中包含導(dǎo)入內(nèi)容,防止濫用類(lèi)型參數(shù)空檢查,以及保證子屬性格式一致。您可以通過(guò)簡(jiǎn)單的命令升級(jí)到新的 Lint:
- Dart package 可以使用:
dart pub upgrade —-major-versions lints
-
Flutter package 可以使用:
flutter pub upgrade —-major-versions flutter_lints
SecureSockets 通常用于啟用受 TLS 和 SSL 保護(hù)的 TCP 套接字。Dart 2.17 發(fā)布之前,由于無(wú)法檢查安全數(shù)據(jù)流量,開(kāi)發(fā)過(guò)程中調(diào)試這些套接字非常困難?,F(xiàn)在我們添加了指定 keyLog 文件的功能。指定日志文件后,與服務(wù)器交換新的 TLS 密鑰時(shí),一行 NSS密鑰日志格式的文本就會(huì)附加到文件中。這樣,網(wǎng)絡(luò)流量分析工具 (如 Wireshark) 即可解密通過(guò)套接字發(fā)送的內(nèi)容。更多詳細(xì)信息,請(qǐng)參閱 SecureSocket.connect() 的 API 文檔:
dart doc 工具生成的 API 文檔是大多數(shù) Dart 開(kāi)發(fā)者學(xué)習(xí)新 API 的重要資源之一。盡管我們的核心庫(kù) API 一直都有詳實(shí)的文本描述,但許多開(kāi)發(fā)者告訴我們,他們更喜歡通過(guò)閱讀示例代碼來(lái)學(xué)習(xí) API。在 Dart 2.17 中,我們徹底檢查了所有主要的核心庫(kù),為瀏覽量排在前 200 名的頁(yè)面添加了詳實(shí)的示例代碼。您可以對(duì)比 Dart 2.16 和 Dart 2.17 中 dart:convert 的文檔頁(yè)面,希望這些更新有助于您更輕松地使用 API 文檔。
為平臺(tái)新增功能可以提升工作效率,清理堆積的既有問(wèn)題,并刪除棄用的功能同樣也可以。這樣做有助于保持精簡(jiǎn)的使用體驗(yàn),對(duì)新上手的開(kāi)發(fā)者而言,這一點(diǎn)尤為重要。為此,我們從 dart:io 庫(kù)中刪除了 231 行已棄用的代碼。如果您仍在使用這些已棄用的 API,可以使用 dart fix 進(jìn)行修復(fù)和替換。我們還在繼續(xù)努力刪除已棄用的 Dart CLI 工具,此外,本次更新刪除了 dartdoc 工具 (使用 dart doc 代替) 和 pub 工具 (使用 dart pub 或 flutter pub 代替)。
擴(kuò)大平臺(tái)集成與支持
平臺(tái)集成與支持是我們的第二個(gè)核心主題。Dart 是一種真正的多平臺(tái)語(yǔ)言。盡管我們現(xiàn)已支持大量平臺(tái),但仍在不斷拓展演進(jìn),確保您可以與每個(gè)受支持的平臺(tái)深度集成,同時(shí)也支持新出現(xiàn)的平臺(tái)。Dart FFI 是我們與 C 語(yǔ)言或原生代碼互操作的核心機(jī)制,廣泛用于將 Dart 代碼與現(xiàn)有原生平臺(tái)代碼集成。在 Flutter 上,Dart FFI 也是構(gòu)建使用托管平臺(tái)原生 API (例如 Windows win32 API) 的插件的理想方法。在 Dart 2.17 和 Flutter 3 中,我們?yōu)?flutter 工具添加了模板,現(xiàn)在您可以輕松地創(chuàng)建 FFI 插件,這些插件的 Dart API 通過(guò) dart:ffi 調(diào)用原生代碼。詳細(xì)信息請(qǐng)參閱官方文檔中的 "開(kāi)發(fā) package 和插件":
為支持在具有 ABI (應(yīng)用程序二進(jìn)制接口) 特有類(lèi)型的平臺(tái)上使用 FFI,F(xiàn)FI 現(xiàn)已支持 ABI 特有類(lèi)型。例如,現(xiàn)在您可以使用 Long (C 語(yǔ)言中的 long) 正確表示 ABI 特有大小的長(zhǎng)整數(shù),由于 CPU 架構(gòu)的區(qū)別,結(jié)果可能是 32 位或 64 位。有關(guān)支持類(lèi)型的完整列表,請(qǐng)參閱 AbiSpecificInteger API 頁(yè)面中的 "Implementers" 列表。
在使用 Dart FFI 與原生平臺(tái)深度集成時(shí),有時(shí)開(kāi)發(fā)者需要調(diào)整適配 Dart 代碼和原生代碼的內(nèi)存或其他資源 (端口、文件等) 的清理行為。長(zhǎng)期以來(lái),這個(gè)問(wèn)題都十分棘手,因?yàn)?Dart 是一種會(huì)自動(dòng)處理清理行為的垃圾回收語(yǔ)言。在 Dart 2.17 中,我們通過(guò)引入 Finalizer 的概念,解決了這個(gè)問(wèn)題。Finalizer 中包括一個(gè) Finalizable 標(biāo)記接口,用于 "標(biāo)記" 不應(yīng)過(guò)早終結(jié)或丟棄的對(duì)象,以及一個(gè)可以附加到 Dart 對(duì)象的 NativeFinalizer 類(lèi),在對(duì)象即將被垃圾回收時(shí)提供回調(diào)運(yùn)行。這樣,在原生代碼和 Dart 代碼中都可以運(yùn)行清理代碼。更多詳細(xì)信息,請(qǐng)參閱 NativeFinalizer API 文檔,或參閱 WeakReference 和 Finalizer 文檔中的描述和示例,以了解常規(guī) Dart 代碼中的類(lèi)似做法。
支持將 Dart 編譯為原生代碼,是使 Flutter 應(yīng)用具有出色啟動(dòng)性能和快速渲染能力的核心要素。除此之外,您還可以使用 dart compile 將 Dart 文件編譯為可執(zhí)行文件。這些可執(zhí)行文件可以在任何機(jī)器上獨(dú)立運(yùn)行,無(wú)需安裝 Dart SDK。Dart 2.17 中的另一個(gè)新功能是支持對(duì)可執(zhí)行文件進(jìn)行簽名,從而在往往需要簽名的 Windows 和 macOS 上進(jìn)行部署。
我們還在積極跟進(jìn)新平臺(tái)的發(fā)展,不斷擴(kuò)大可支持的平臺(tái)范圍。RISC-V 是一個(gè)全新的處理器指令集。RISC-V International 是一家全球非營(yíng)利性組織,其擁有 RISC-V 規(guī)范并使該指令集保持自由開(kāi)放的狀態(tài)。盡管仍是新平臺(tái),但其潛力無(wú)限,因此我們的 2.17.0–266.1.beta Linux 版本 (以后可能進(jìn)入我們的 beta 渠道) 中已經(jīng)為其提供了實(shí)驗(yàn)性的支持。我們希望能夠獲得您的反饋,請(qǐng)大家不吝提出問(wèn)題或分享使用體驗(yàn)!
即刻使用 Dart 2.17!
我們希望 Dart 2.17 版本能打動(dòng)您,并能助力您提高工作效率,把您的應(yīng)用帶去更多平臺(tái)。您可以即刻下載 Dart 2.17 并開(kāi)始使用,或者使用 Flutter 3 SDK 中包含的 Dart SDK。
文章出處:【微信公眾號(hào):谷歌開(kāi)發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
Google
+關(guān)注
關(guān)注
5文章
1752瀏覽量
57327 -
SDK
+關(guān)注
關(guān)注
3文章
1015瀏覽量
45607 -
Dart
+關(guān)注
關(guān)注
0文章
9瀏覽量
1734
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論