跳至主要內容

重大變更與棄用

本頁列出 Dart SDK 中所有的重大變更與棄用,依發布版本和區域分類,以協助 Dart 使用者瞭解並管理其影響。完整的發布版本注意事項可在Dart SDK 變更日誌中取得。重大變更政策文件說明了 Dart 中重大變更與棄用的政策與流程。

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

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

    這些是大多數的變更,且未在此列表中特別標記。

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

    這些標記為: 語言版本化

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

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

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

    這些標記為:實驗性

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

3.7.0

#

語言

#

函式庫

#

dart:htmldart:indexed:dbdart:svgdart:web_audodart:web_gldart:js

#
  • 已棄用 這些舊版 Web 函式庫已正式棄用。預計在未來版本中移除。專案應遷移至使用 package:webdart:js_interop。若要瞭解詳情,請查看遷移至 package:web

dart:jsdart:js_utilpackage:js

#
  • 已棄用 這些舊版 JS 互通函式庫已正式棄用。預計在未來版本中移除。專案應遷移至使用 dart:js_interop。若要瞭解詳情,請查看JS 互通性用法

工具

#

分析器

#

格式化工具 (dart format)

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

3.6.0

#

語言

#

函式庫

#

dart:io

#

工具

#

分析器

#

編譯器前端 (cfe)

#

Wasm 編譯器 (dart2wasm)

#
  • 條件 dart.library.js 在編譯為 WebAssembly 時,在條件式匯入上現在為 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 選項已移除。
    • Dart_NewListOfDart_IsLegacyType 函式已從 C API 移除。
  • 已移除 Dart_DefaultCanonicalizeUrl 函式已從 C API 移除。

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 選項指定格式,可以是 binaryjsonjson 格式已棄用,可能會在未來的 Dart 版本中移除。

Wasm 編譯器 (dart2wasm)

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

執行階段

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

3.3.0

#

SDK

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

    • patterns
    • records
    • class-modifers
    • sealed-class

語言

#

函式庫

#

dart:cli

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

dart:ffi

#

dart:html

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

dart:io

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

dart:js_interop

#
  • 實驗性 JS 類型 (例如 JSAny) 具有新的編譯器特定表示類型
  • 實驗性 使用者定義的 @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 (無效的 null 感知運算子)

Linter

#
  • iterable_contains_unrelated_typelist_remove_unrelated_type linter 已移除。請考慮遷移至擴充的 collection_methods_unrelated_type linter。

  • 由於健全的 Null 安全性不再需要,因此以下 linter 已移除。您應從您的 analysis_options.yaml 檔案和任何忽略註解中移除它們的設定。

    • always_require_non_null_named_parameters
    • avoid_returning_null
    • avoid_returning_null_for_future

3.2.0

#

語言

#
  • 語言版本化 變更了可反駁模式的分割點至最上層模式,因此 if-case 語句中的類型提升與審查對象是否可能擲回例外狀況無關,保持一致。

函式庫

#

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 擴充成員無法再用作 tear-off。宣告一個閉包或呼叫這些成員的非 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

#
  • 已移除 已移除先前棄用的 API ServiceExtensionResponse 中的 kInvalidParamskExtensionErrorkExtensionErrorMaxkExtensionErrorMin

dart:ffi

#

dart:io

#

dart:isolate

#
  • 還原了 SendPort.send 回到對訊息內容的嚴格檢查,當在已知不共享相同程式碼的隔離區之間傳送訊息時。

dart:mirrors

#

package:js

#

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 中的 setter 回呼 .authenticate.authenticateProxy 現在必須接受可為 null 的 realm 引數(適用於預先遷移的 Null 安全程式碼)。

dart:typed_data

#

工具

#

Dart VM

#

Dart 命令列

#

dart2js

#

Dart Dev Compiler (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 Dev Compiler (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

#

語言

#

函式庫

#

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

#
  • 不允許在 const map 中使用重複的鍵,並且會產生編譯時期錯誤。

2.0.0

#

語言

#

函式庫

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

工具

#

Pub

#