目錄

重大變更和棄用

本頁列出 Dart 中所有語言和程式庫的重大變更和棄用,並按發佈版本和區域組織,以協助 Dart 使用者瞭解和管理其影響。完整的發佈說明可在 Dart SDK 變更日誌中找到。重大變更原則文件說明了 Dart 中重大變更和棄用相關的原則和流程。

本頁包含下列類型的重大變更:

  • 未版本化:Dart SDK 不維持向後相容性,如果您依賴先前的行為,則在您升級 SDK 版本後,程式碼可能會立即中斷。

    這些是大多數變更,且未在本清單中特別標記。

  • 語言版本化:Dart SDK 為現有程式碼維持向後相容性,且行為變更僅在您升級程式碼的語言版本時才會生效(可能會中斷依賴先前行為的程式碼)。

    這些標記為: 語言版本化

  • 棄用:Dart SDK 維持已棄用程式碼的相容性,並發出警告。然後在後續版本中完全移除棄用項目,從而中斷任何依賴先前行為的程式碼。

    這些標記為: 已棄用 / 已移除

  • 實驗性:屬於發佈版本的一部分,但在 SDK 中尚未視為穩定版本,且可能會在版本之間中斷。實驗性變更不一定有對應的重大變更問題,但可能在 SDK 變更日誌中有更多詳細資訊。

    這些標記為: 實驗性

如果您對任何這些重大變更有疑問或疑慮,請在相關條目的重大變更問題連結中發表評論。若要收到未來重大變更的通知,請加入 Dart 公告群組。

3.7.0

#

暫定
下列變更預計會包含在 3.7 穩定版本中,但最終清單可能在此之前變更。為減少這些變更的潛在影響,請考慮在 3.7 版本發佈前處理它們。

語言

#

工具

#

分析器

#

格式化程式 (dart format)

#
  • 語言版本化 格式化程式實作了新樣式,當格式化語言版本為 3.7 或更高版本的程式碼時,會產生新的輸出。
  • 已移除 dart format--fix 旗標不再支援。若要套用類似修正和更多修正,請設定您的分析選項並執行dart fix
  • 已棄用 dart format--line-length 選項已棄用,並設定為移除。所有用法都應遷移至新的 --page-width 選項。

3.6.0

#

語言

#

程式庫

#

dart:io

#

工具

#

分析器

#

編譯器前端 (cfe)

#

Wasm 編譯器 (dart2wasm)

#
  • 編譯為 WebAssembly 時,條件式匯入中的 dart.library.js 條件現在為 false。應改為使用 dart.library.js_interop 條件。

格式化程式 (dart format)

#

當使用 Dart 3.6 SDK 或更新版本執行 dart format 時,下列變更可能會導致小的格式變更

  • 在同時使用 this.super. 的舊式函式類型形式參數上保留類型參數。
  • 正確格式化同時具有 asif 子句的匯入。

Pub

#
  • 如果 Git 中追蹤的檔案有未提交的變更,dart pub publish 現在會發出警告。

3.5.0

#

語言

#

程式庫

#

dart:core

#

dart:io

#

dart:js_interop

#

dart:typed_data

#

執行階段

#
  • 已移除 Dart VM 不再支援不健全的 null 安全性。
    • 已移除 --no-sound-null-safety CLI 選項。
    • 已從 C API 中移除 Dart_NewListOfDart_IsLegacyType 函式。
  • 已移除 已從 C API 中移除 Dart_DefaultCanonicalizeUrl 函式。

3.4.0

#

語言

#

程式庫

#

dart:cli

#

dart:htmldart:indexed:dbdart:svgdart:web_audodart:web_gl

#
  • 已棄用 這些函式庫現在標記為舊版,未來將會減少支援。新專案應優先使用 package:webdart:js_interop。若要瞭解詳情,請查看 移轉至 package:web

dart:js

#
  • 已棄用 此函式庫現在標記為舊版,未來將會減少支援。應將使用方式移轉至 dart:js_interopdart:js_interop_unsafe。若要瞭解詳情,請查看 /go/next-gen-js-interop

dart:js_util

#
  • 已棄用 此函式庫現在標記為舊版,未來將會減少支援。應將使用方式移轉至 dart:js_interopdart:js_interop_unsafe。若要瞭解詳情,請查看 /go/next-gen-js-interop

dart:io

#

dart:typed_data

#

工具

#

生產 JavaScript 編譯器 (dart2js)

#
  • 實驗性 已棄用 現在您應該為 --dump-info CLI 選項指定 binaryjson 格式。json 格式已棄用,可能會在未來的 Dart 版本中移除。

Wasm 編譯器 (dart2wasm)

#
  • 實驗性 已更新、移除或取代各種 dart compile wasm CLI 引數。若要瞭解詳情,請執行 dart compile wasm --verbose --help

執行階段

#
  • 已移除 Dart VM 不再支援外部字串。因此,已從 Dart C API 中移除 Dart_IsExternalStringDart_NewExternalLatin1StringDart_NewExternalUTF16String 函式。

3.3.0

#

SDK

#
  • 實驗性 已移除 以下實驗現在已停用,因為它們已在 Dart 3 中發佈,並且在語言版本為 3.0 或更高版本時不再需要。應從分析選項、CLI 命令和 IDE 設定中移除它們的組態。

    • 模式
    • 記錄
    • 類別修飾詞
    • 密封類別

語言

#

程式庫

#

dart:cli

#
  • 實驗性 已棄用 waitFor 函式 仍然在另一個版本中被棄用,並將在 Dart 3.4 中移除。

dart:ffi

#

dart:html

#
  • 現在建議使用 package:http,而不是直接使用 HttpRequest

dart:io

#
  • 現在建議使用 package:http,而不是直接使用 HttpClient

dart:js_interop

#
  • 實驗性JSAny 這樣的 JS 型別具有新的編譯器特定表示型別
  • 實驗性 使用者定義的 @staticInterop 類別不再可以實作 JSAnyJSObject。應將使用方式移轉至 JSObject.fromInteropObject 或定義為擴充功能型別。
  • 實驗性 JSArrayJSPromise 現在具有泛型參數。
  • 實驗性 已移動或重新命名各種擴充功能成員。若要瞭解更新的擴充功能,請參考 JSAnyUtilityExtensionJSAnyOperatorExtension

dart:typed_data

#

dart:nativewrappers

#

工具

#

生產 JavaScript 編譯器 (dart2js)

#

Wasm 編譯器 (dart2wasm)

#

分析器

#
  • 實驗性 分析器現在會報告無效的 dart doc 註解指示詞。

  • 由於 型別提升的改進,下列分析器診斷可能會在先前通過分析的現有程式碼上觸發

    • unnecessary_non_null_assertion
    • unnecessary_cast
    • invalid_null_aware_operator

Linter

#
  • 已移除 iterable_contains_unrelated_typelist_remove_unrelated_type lint。請考慮移轉至擴充的 collection_methods_unrelated_type lint。

  • 由於健全的 null 安全性不再需要下列 lint,因此已將它們移除。您應該從 analysis_options.yaml 檔案和任何忽略註解中移除它們的組態。

    • always_require_non_null_named_parameters
    • avoid_returning_null
    • avoid_returning_null_for_future

3.2.0

#

語言

#

程式庫

#

dart:cli

#

dart:convert

#

dart:developer

#
  • 已棄用 Service.getIsolateID 方法。

dart:ffi

#

dart:io

#

dart:js_interop

#
  • 實驗性 已移除 JSNumber.toDart,改用 toDartDoubletoDartInt
  • 實驗性 已移除 Object.toJS,改用 Object.toJSBox
  • 實驗性 使用 dart:js_interop 將外部 JS 互通 API 限制為一組允許的型別。
  • 實驗性 禁止在 dart2wasm 上使用 isNullisUndefined
  • 實驗性 已將 typeofEqualsinstanceof API 都變更為傳回 bool 而不是 JSBoolean。此外,typeofEquals 現在採用 String 而不是 JSString
  • 實驗性 已變更 JSAnyJSObject 型別,使其僅可由使用者 @staticInterop 型別實作,而不可擴充。
  • 實驗性 已變更 JSArray.withLength 以採用 int 而不是 JSNumber

工具

#

開發 JavaScript 編譯器 (DDC)

#

生產 JavaScript 編譯器 (dart2js)

#

分析器

#

3.1.0

#

程式庫

#

dart:async

#

dart:io

#

dart:js_interop

#
  • 實驗性 已移除 ObjectLiteral;使用 {}.jsify() 建立沒有具名成員的物件文字。

package:js

#
  • external @staticInterop 成員和 external 擴充功能成員不能再用作撕裂值。請宣告一個會呼叫這些成員的閉包或非 external 方法,並改用它。
  • external @staticInterop 成員和 external 擴充功能成員會為具有選用參數的方法產生稍微不同的 JS 程式碼。

3.0.0

#

語言

#

程式庫

#
  • 以下現有類別已改為 mixin 類別:IterableIterableMixinIterableBaseListMixinSetMixinMapMixinLinkedListEntryStringConversionSink

dart:core

#

dart:async

#

dart:collection

#

dart:developer

#

dart:ffi

#
  • 實驗性 已棄用 @FfiNative 注釋現在已棄用。應將用法更新為使用 @Native 注釋。

dart:html

#

dart:math

#
  • 語言版本化 Random 介面只能實作,不能擴展。

dart:io

#

2.19.0

#

語言

#

程式庫

#

dart:convert

#

dart:developer

#

dart:ffi

#

dart:io

#

dart:isolate

#
  • 已將 SendPort.send 還原為對在隔離區之間傳送訊息時,訊息內容進行嚴格檢查,這些隔離區已知未共用相同的程式碼。

dart:mirrors

#

package:js

#
  • 對預覽功能 @staticInterop 的重大變更

dart2js

#

2.18.0

#

語言

#

程式庫

#

dart:io

#

工具

#

Dart 命令列

#

2.17.0

#

程式庫

#

dart:io

#

工具

#

Dart 命令列

#

2.16.0

#

程式庫

#

dart:io

#

dart:isolate

#

工具

#

Dart 命令列

#

2.15.0

#

程式庫

#

dart:io

#

dart:web_sql

#

dart:html

#

工具

#

Dart 命令列

#

Dart VM

#

2.14.0

#

程式庫

#

dart:io

#
  • HttpClient 中的設定器回呼 .authenticate.authenticateProxy 現在必須接受可為 null 的 realm 引數 (適用於遷移前的空值安全程式碼)。

dart:typed_data

#

工具

#

Dart VM

#

Dart 命令列

#

dart2js

#

Dart 開發編譯器 (DDC)

#

2.13.0

#

程式庫

#

package:js

#
  • 不再有效,在非匿名 JS 互通類別的 @JS() 注釋中使用與 @Native 注釋相符的 String

2.12.0

#

語言

#

程式庫

#

dart:ffi

#

工具

#

Dart VM

#

Pub

#

2.10.0

#

工具

#

Dart VM

#

2.9.0

#

程式庫

#

dart:convert

#

dart:html

#
  • 如果 CssClassSet 對應到多個元素,CssClassSet.add()CssClassSet.toggle 現在會返回 false 而不是 null

dart:mirrors

#

工具

#

Dart VM

#

2.8.1

#

語言

#

程式庫

#

dart:async

#

dart:core

#

dart:ffi

#
  • Pointer.asFunction()DynamicLibrary.lookupFunction() 變更為擴展方法。

dart:io

#

工具

#

Dart 開發編譯器 (DDC)

#

我們修正了 DDC 和 Dart2JS 之間的一些不一致之處,以便使用者較少遇到被一個編譯器接受但在另一個編譯器中失敗的程式碼。

  • 刪除了舊版 (基於分析器) 的 DDC
  • 使用建議的 package:js 互通規格傳遞給 JavaScript 的函式現在必須使用 allowInterop 呼叫來包裝。
  • @JS() 類別中的建構函式必須標記為 external

dart2js

#
  • 對應的型別參數邊界現在只需要是相互子類型,而不是在重新命名綁定型別變數和等同所有頂層型別的情況下在結構上相等。
  • 型別現在會被正規化
  • @JS() 類別中的建構函式必須標記為 external
  • 完全移除了 --package-root 標誌,該標誌在 Dart 2.0.0 中已隱藏且停用。

2.7.1

#

2.7.0

#

語言

#

程式庫

#

dart:io

#
  • 新增了 IOOverrides.serverSocketBind,以協助編寫希望模擬 ServerSocket.bind 的測試。

2.6.0

#

語言

#
  • 當在 FutureOr 環境中使用 Null 值時,變更了推斷。也就是說,類似於 Null <: FutureOr<T> 的形式的約束現在會產生 Null 作為 T 的解。

程式庫

#

dart:ffi

#
  • API 現在使用靜態擴展成員。
  • 移除了記憶體管理 Pointer.allocatePointer.free
  • 移除了 Pointer.offsetBy,請改用 castelementAt

2.5.0

#

程式庫

#

dart:io

#

工具

#

Pub

#

2.4.0

#

語言

#

程式庫

#

dart:isolate

#
  • 當使用 dart2js 或 DDC 編譯時,Isolate.resolvePackageUri 將永遠擲回 UnsupportedError

dart:async

#

2.2.0

#

程式庫

#

package:kernel

#
  • 為了保持一致性,Kernel AST API 中 InstanceConstant 類別上的 klass getter 已重新命名為 classNode
  • 更新了 Link 實作,以便在 Windows 上使用真正的符號連結而不是聯結。

2.1.1

#

程式庫

#

dart:io

#

工具

#

Dart VM

#

2.1.0

#

語言

#

工具

#

dart2js

#
  • 常數 map 中的重複鍵是不允許的,並且會產生編譯時錯誤。

2.0.0

#

語言

#

程式庫

#
  • 將核心程式庫中的常數從 SCREAMING_CAPS 重新命名為 lowerCamelCase
  • 在核心程式庫類別中新增了許多新的方法,如果您實作這些類別的介面,則需要實作這些方法。
  • 在 Web 上使用 Dart 時,不再支援 dart:isolatedart:mirrors

工具

#

Pub

#