Dart 2 有一些與早期版本 Dart 不同的關鍵點。本文將會簡單地介紹這些差異並提供了一些將程式碼遷移到 Dart 2 的建議。
至於 為什麼 Dart 2 要做這些改變,你可以查閱 Dart 2 公告
差異點
Dart 語言、庫、編譯系統以及 Web 開發工具都已經有所變化。
語言和庫
-
Dart 的型別系統 現在是健全的。
-
例項物件建立的關鍵字現在是可選的,就像 使用建構函式 中所說的那樣:
-
new
關鍵字總是可選的。 -
const
在常量上下文環境中也是可選的。
-
-
Dart 不再有檢查模式。
-
Assert 陳述式 依然支援,但是開啟的方式改變了。
-
-
標記為
async
的方法現在可以同步執行,直到第一個await
陳述式為止。-
之前是立刻返回給呼叫者,方法體內的程式碼會在之後執行。
-
瞭解更多,請閱讀 2017 年 9 月的 Dart 新聞快報。
-
-
Dart 語言和核心庫也改變了,部分原因是因為型別系統的改變而改變。
工具
-
Pub 不再支援轉換。作為替代,請使用 新的編譯系統。
-
Web 開發相關的工具已經改變。
-
新的編譯系統 替代
pub build
和pub serve
。 -
Dartium is no longer supported. Instead, use the
webdev
tool and Chrome. -
Dartium 不再支援。作為替代,使用
webdev
工具 和 Chrome。
-
遷移你的程式碼
如何遷移你的程式碼取決於你的程式碼有多古老以及執行在什麼平台。有關如何遷移 Web 應用的幫助請查閱 [ Web 應用遷移指南][webdev dart2]。如果你遷移一個 Flutter 應用,請查閱 變革公告 如果你釋出了 package,則除了適配平台不同的特性之外,還需要遵循 下述的 package 遷移說明。
通用流程
下面是遷移到 Dart 2 的一個流程概述。
-
獲取一個最新的 Flutter 或 Dart SDK 版本以及你所使用的 IDE 的最新外掛。
-
Dart SDK 說明 (伺服器端或 Web)
-
升級你應用依賴的 package。
-
Flutter:
flutter pub upgrade
Flutter:
flutter pub upgrade
-
- Server-side or web:
dart pub upgrade
伺服器端或 Web:
dart pub upgrade
- Server-side or web:
-
-
執行 dart2_fix 工具,它可以幫助遷移一些過時的 Dart 1.x API 到 Dart 2。
-
執行分析器以找出 編譯時錯誤 以及棄用提示。
-
Flutter:
flutter analyze
或使用 Android Studio/IntelliJ 或 VS Code 的問題檢視。 -
伺服器端或 Web:[
dart analyze
][dartanalyzer]
-
-
修復程式碼問題並再次執行分析器,重複該操作直到你的程式碼透過靜態分析。
-
執行測試以找出 執行時錯誤
-
執行你軟體所有的 [自動化測試]。
-
執行手動測試以查詢控制檯錯誤。
考慮新增自動化測試來捕獲你發現的問題。
-
-
修復問題知道你的程式碼可以正常執行。
-
可選的: 移除
new
以及不必要的const
關鍵字。-
你可以手動地移除它們或者使用類似
dart format --fix
這樣的工具。 -
為了找到
new
和不必要的const
出現的地方,可以將unnecessary_new
和unnecessary_const
規則新增至 分析選項檔案 的linter
部分。
-
遷移 package
作為一個 package 的擁有者,你需要遵循下列幾項:
-
遵循你的 package 所支援的平台的遷移技巧(詳見 上述)。
-
確保你的 package 通過了 Dart 2 分析(查閱上面的執行分析器)。
-
確保你 package 的使用者知道如何上報問題。
-
能夠對上報的問題快速地作出響應。
-
如果程式碼的變更導致無法向後相容,請升級最低的 SDK 版本限制。
遷移 Web 應用
如果需要將你的 Web 應用更新到使用 Dart 2.x,你需要先更新一波 工具。
你還要對 <script>
元素進行如下的改動,以更新編譯後的 Dart 程式碼參考:
-
刪除
<script defer src="packages/browser/dart.js"></script>
-
用
<script defer src="foo.dart.js"></script>
替換
<script defer src="foo.dart" type="application/dart"></script>
變化以及向後相容性
如果你必須更改 package 的程式碼,請 嘗試令其可以在 1.x 中使用,就像其在 Dart 2 中使用那樣。例如,你可能需要新增型別註解(或者如果一個已被移除的 API)去使用一個替代的 1.x API。
如果程式碼的變更導致無法向後相容,請升級最低的 SDK 限制
測試你程式碼的變更 以確保你的 package 在使用時可以如你所願地執行。
SDK 版本上限
一旦你的 package 通過了 Dart 2 分析,請更新版本上限以表明其支援相容到 Dart 2:
environment:
# 只能在 Dart 2 中使用
sdk: '>=2.0.0 <3.0.0'
如果你計劃保持與舊版 Dart 的相容性,請相應地調整 SDK 為較低的版本限制:
environment:
# 可以在 Dart 1(1.20.1 開始)以及 Dart 2 中使用。
sdk: '>=1.20.1 <3.0.0'
如果你使用 2.0 後引入的功能 請確保你指定了正確的 SDK 下限:
environment:
# 可以在 2.1 中使用但不能在 2.0 中使用
sdk: '>=2.1.0 <3.0.0'
更多資源
-
更新你的 pub package 到 Dart 2,這篇文章包含了更新程式碼和使用 Travis 執行可持續整合 (CI) 測試的技巧。