【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】
介紹 Dart 3 alpha
12 月,我們發表了第一篇關於 Dart 3 的部落格文章,讓我們得以一窺未來。今天,在肯亞奈洛比舉行的 Flutter Forward 開發者活動現場,我們分享了 Dart 下一個主要版本的更廣泛願景,以及我們的第一個預覽版本 Dart 3 alpha。
我們的 Dart 使命是創造最好的程式語言,以便在任何應用程式平台上構建高品質的應用程式。Dart 易於上手、易於學習,避免不必要的複雜性,並且內部一致。Dart 生產力高;應用程式開發人員面臨著持續的壓力,需要在更短的時間內交付具有不斷變化的需求的應用程式,同時還要保證品質和完成度。因此,我們在構建 Dart 時,非常注重實現快速開發、快速迭代和高品質。Dart 還具有 可移植性,涵蓋最廣泛的平台,使您能夠將應用程式部署到現在和未來的設備上。
多年來,我們一直致力於建立這些品質。藉由 Dart 3,我們打算邁出更大的一步,以顯著的方式改進和擴展易用性、生產力和可移植性。
Dart 3 是一個全新的 主要 版本。部分原因是為了表示新功能的重大進展,部分原因是就語義版本控制而言,它是一個 重大變更版本:我們正在將類型系統更改為 僅 支援 完善的空值安全(在 Dart 2.12 及更高版本中,這是 可選的),並在 Dart 的核心函式庫中進行了相應的重大變更。讓我們深入了解細節!
Dart 3 生產力提升
更具表現力的 Dart 語言:記錄、模式和存取控制
過去幾年,我們以飛快的速度發展 Dart 語言,自 2.0 版以來 新增了 23 項新功能。在 Dart 3 中,我們預計會新增兩項主要功能,即記錄和模式,目標是讓使用結構化資料更有效率。
記錄允許您有效且簡潔地從任何現有資料建立匿名複合值,而無需宣告類別來儲存這些值的思維負擔。使用記錄,您可以輕鬆構建組合現有資料的新資料結構。例如,要返回一對值:
1 | (int, int) geoLocation(String address) { |
記錄允許您組合資料,而模式可以將複合資料解構為其組成部分。例如,要將上面 geoLocation
的返回值(由一對整數組成的記錄)解構為兩個單獨的整數變數 lat
和 long
,您可以使用如下模式宣告:
1 | var (lat, long) = geoLocation(address); |
模式是完全類型安全的,並在開發過程中進行檢查。
您還可以根據值的類型進行模式匹配,例如從類別的階層結構中匹配。switch
可以使用與類型匹配的模式,以及每種類型的單獨欄位,如下所示 calculateArea
的主體:
1 | double calculateArea(Shape shape) { |
總體而言,我們正在添加大量模式,這些模式組合在一起使 Dart 在處理結構化資料時更具表現力。
結合模式,我們還透過幾個新的修飾符為類別新增了 能力控制:
- interface class:不能被繼承。
- base class:禁用隱式介面,因此不能被實作。
- final class:不能繼承、實作或混合使用該類別(在目前的函式庫之外)。
- sealed class:與
abstract + final
相同,並且該類型被視為密封類型族的根,用於窮盡性檢查。例如,以上面的Shape
類別階層為例。在Shape
類型的switch
語句中(如calculateArea
函數),如果switch
語句未處理密封類型的所有可能子類型,分析器將觸發錯誤。 - mixin class:可以用作 mixin 的類別。
每個新功能都會增加語言的複雜性。為了確保 Dart 保持易於上手,類別預設是完全允許的,就像今天一樣,只有一個小例外,即打算用作 mixin 的類別現在必須使用 mixin
關鍵字。
透過直接平台函式庫互操作實現高效的平台整合
我們正在努力擴展 Dart 語言的互操作性,以便 直接從 Dart 調用平台函式庫。在 Apple 平台上,我們正在基於我們在 FFI for C interoperability 上的工作,它支援從 Dart 調用任何遵循 C 調用約定的 C 模組。到目前為止,它支援 C、Go 和 Rust 等語言。現在,我們正在為 iOS/macOS 上的 Swift 和 Objective-C 新增支援。在 Android 上,您可以利用 FFI 和 Android 的 Java Native Interface (JNI) 調用以 Kotlin 編寫的 Jetpack 函式庫和以 Java 編寫的 Android 函式庫。
在新的工具的支持下,Dart 可以根據原始 C/ObjC/Swift/Java/Kotlin 程式碼的標題/介面檔案自動建立具有 Dart 介面的繫結,以及這些繫結背後的跨語言互操作程式碼。有關使用此方法調用 Apple 的 Core Motion API 和 Android 的 HealthConnect API 的示範,請查看 範例應用程式。
這些新的互操作機制目前尚處於實驗階段,但我們希望它們至少能在 Dart 3.0 穩定版中達到 beta 品質。我們歡迎您在 Java/Kotlin 或 C/ObjectiveC/Swift 的問題追蹤器中提供回饋。最後,我們也在努力改進 Dart 與 JavaScript 的互操作性;我們將在以後的部落格文章中提供更多相關資訊。
可移植性方面的進展
Dart 已經透過我們的原生和網路編譯器支援廣泛的目標平台。在 Web 上,我們目前編譯為 JavaScript。在原生設備上,我們目前支援 Intel 32 位和 64 位,以及 ARM 32 位和 64 位架構。我們正在努力為許多新興的設備和標準新增支援,以確保 Dart 為未來的設備做好準備。
對於 Web,我們正在努力支援 WebAssembly (Wasm),它作為一個平台中立的二進制指令格式,在 所有現代瀏覽器 中都日趨成熟。我們希望 Wasm 能夠使 Dart Web 應用程式的啟動速度與原生設備上的應用程式一樣快。
另一個越來越受關注的平台架構是 RISC-V,這是一種為廣泛使用而設計的開放標準指令集架構 (ISA)。Android 團隊最近就 他們對 RISC-V 的支援工作 進行了演講,我們認為它也將廣泛應用於嵌入式設備。Dart 3 alpha 中提供了對 RISC-V 的預覽支援。
最後,我們正在努力擴展我們目前對 ARM 設備的支援,使其也涵蓋 Windows 上的 ARM64 支援。
Dart 3 的重大變更
介紹了新的 Dart 3 功能後,讓我們來看看我們為了更一致且更易於上手的 Dart 而進行的重大變更。
Dart 3 類型系統:100% 完善的空值安全
我們在 2021 年的 Dart 2.12 中引入了完善的空值安全。在完善的類型系統中,您可以信任類型,這意味著當類型聲明變數不為空時,它就 永遠 不為空。這提高了生產力,因為可以在開發過程中而不是在生產環境中發現問題,並且使 Dart 編譯器能夠產生 更小、更優化的程式碼。正如我們在 12 月 所討論的,Dart 的獨特之處在於將 100% 完善的空值安全引入到現有語言中。
自 Dart 2.12 起,空值安全一直是一個可以 開啟 或 關閉 的設定選項。在 Dart 3 中,所有程式碼都以 開啟 完善的空值安全運行。不再可以運行沒有空值安全的應用程式或在部分空值安全的混合模式下運行應用程式。
我們意識到停止支援不使用空值安全的運行可能會給現有的應用程式和套件帶來問題。但是,我們覺得現在是推進這一變更的合適時機。擁有一個單一的類型系統,其中空值安全始終開啟,可以減少開銷和複雜性。每當開發人員讀取一段 Dart 3 程式碼時,他們都可以放心,所有變數預設都不為空。在實作方面,Dart 的編譯器和運行時可以專注於支援單一的 Dart 程式碼運行方式,從而降低新增新功能的成本和複雜性。
Dart 生態系統已經展現出將現有程式碼遷移到空值安全的堅定決心和意願。截至今天,
- pub.dev 上排名前 250 位的套件中有 100% 支援空值安全
- pub.dev 上排名前 1000 位的套件中有 98% 支援空值安全
- 只有 14% 的
flutter run
階段仍然在沒有空值安全的情況下運行
感謝生態系統為遷移所做的努力!
清理 Dart 3 核心函式庫和語言
隨著 Dart 語言和類型系統的發展,我們核心函式庫中的一些 API 變得冗餘或不夠理想。為了確保 Dart 保持易於上手,我們進行了一些重大變更以清理不必要的 API。有關詳細資訊,請參閱 GitHub 問題,#34233 和 #49529。我們還移除了一個歷史語法,用於預設參數值(#2357)。
隨著 Dart 3 alpha 的完成,我們的注意力現在轉向了 Dart 3 beta。在那裡,我們希望透過新增一些新的 API 來進一步改進 Dart 核心函式庫。您可以在 回饋問題 中提供意見。
準備您的程式碼以迎接 Dart 3 穩定版
一般來說,我們相信大多數已經遷移到使用空值安全(使用 Dart 2.12 或更高版本)的程式碼都可以在 Dart 3 上運行。但是,一小部分套件和應用程式可能會受到上面討論的重大變更的影響。因此,為了讓您有時間準備今年晚些時候發佈的 Dart 3 穩定版,我們沒有計劃在 Dart 3 alpha 之後對 Dart 語言和核心函式庫進行任何進一步的重大變更。
為了利用已經遷移到使用空值安全的程式碼,我們在 Dart 3 中實作了向後相容性,這將允許遷移的套件在 Dart 3 中使用 pub get
解析,即使它們的 SDK 版本限制為 >=2.12 <3.0.0
,只要它們不依賴於其他已停止使用的核心函式庫 API 或語言功能。有關更多詳細資訊,包括如何使用本地安裝的 Dart 3 alpha SDK 進行測試,請參閱我們的 Dart 3 空值安全文件。
對於發佈在 pub.dev 儲存庫上的套件,我們使用 Dart 3 alpha 進行了分析,並使用 “Dart 3 ready” 標籤標記了通過的套件。這表示該套件很可能在今年晚些時候 Dart 3 穩定版發佈時可以運行。
Dart 3 工具清理
在 Dart 3 發佈之前,我們進行了 許多變更,將我們所有的終端開發者工具都移動到一個統一的 dart
開發者工具中,這使得 Dart 對新開發者來說更容易上手。我們計劃在接下來的幾個月中進行 額外的工具變更 以進一步清理。希望這些變更不會造成太大的破壞,但在 Dart 3 beta 中,工具可能會出現一些小的損壞。
後續步驟
Dart 3 alpha 今天已在 Dart 開發頻道和 Flutter master 頻道中提供。我們邀請您試用它,無論是嘗試記錄和模式等新語言功能,還是嘗試我們新的直接存取平台互操作,或者測試您的應用程式和套件的 Dart 3 相容性。
我們將在接下來的幾個月中繼續改進 Dart 3,並希望在今年晚些時候發佈完整的 Dart 3 穩定版。請注意,大多數功能仍在開發中,因此在穩定版發佈之前可能會有所變更。在此之前,祝您使用 Dart 程式碼愉快!
介紹 Dart 3 alpha 最初發佈在 Medium 的 Dart 上,人們在那裡透過醒目顯示和回應這個故事來繼續討論。