Dart 2 與 Dart 的早期版本有幾處關(guān)鍵的不同。本章簡單介紹這些差異,并給出遷移代碼到 Dart 2 的一般建議。
關(guān)于 Dart 2 為什么改變的信息,請看 Dart 2 公告。
不同點
Dart 語言、庫、編譯系統(tǒng)、以及 web 開發(fā)工具都有改變。
語言和庫
- Dart 的類型系統(tǒng)現(xiàn)在是健全的。
- Dart 不再有檢查模式。
- 斷言語句仍然支持,但不同的是你需要啟動它。
- Dart 語言和核心庫已經(jīng)改變,部分原因是由于類型系統(tǒng)改變導(dǎo)致的。
Tools
- Pub 不再支持 transformers。使用新編譯系統(tǒng)代替。
- 與 web 開發(fā)相關(guān)的工具已經(jīng)改變。
- 新的編譯系統(tǒng)代替
pub build和pub serve。 - Dartium 不再支持。使用 dartdevc 和 Chrome 代替。
- 新的編譯系統(tǒng)代替
遷移代碼
首先,查看平臺遷移指南:
如果你發(fā)布包,還需要查看 package migration instructions below。
一般過程
這里是從 Dart 1.x 或 Dart 2 的早期版本遷移到 Dart 2 的過程概述。
-
獲取 Flutter 或 Dart SDK 的最新版。
- Flutter SDK 說明
- Dart SDK 說明 (VM 或 web)
-
升級應(yīng)用依賴的包。
- Flutter:
flutter packages upgrade - Dart VM or web:
pub upgrade
- Flutter:
- 運(yùn)行 dart2_fix tool。
-
運(yùn)行分析器查找編譯時錯誤。
- Flutter:
flutter analyze - Dart VM or web:
dartanalyzerwith Dart 2 semantics
- Flutter:
- 修復(fù)代碼并再次運(yùn)行分析器,不斷重復(fù),直到代碼通過靜態(tài)分析。
-
運(yùn)行測試,查找運(yùn)行時錯誤。
- 運(yùn)行軟件的所有自動化測試。
- 手動測試,并查找控制臺錯誤??紤]添加自動化測試來捕獲你發(fā)現(xiàn)的問題。
- 修復(fù)問題直到代碼正常工作。
每次 SDK 有重大發(fā)布,重復(fù)以上過程。
遷移包
作為一個包的擁有者,你需要做以下事情:
- 遵循你的包支持平臺(看上面)的遷移提示。
- 確保你的包的使用者知道如何報告問題。
- 快速響應(yīng)報告的問題。
- 如果代碼不是向后兼容的,更新最低 SDK 約束。
變化和向后兼容
如果你必須改變你的包的代碼,使其在1.x 和 Dart 2 上運(yùn)行。例如,你可能會添加類型注解或(一個 API 已經(jīng)移除)使用一個替代的 1.x API。
如果改變不能做到向后兼容,更新最低SDK 約束。
小心地指定 SDK 約束!錯誤的最低約束對于使用穩(wěn)定版 SDK 的用戶可能引起問題。
測試你的改變以確保你的包按預(yù)期運(yùn)行。
SDK 版本的最高約束
不要更新一個已發(fā)布的包單獨指出它可以用于 Dart 2 預(yù)發(fā)行版。只要一個包沒有 SDK 約束或一個<2.0.0的最高約束,pub get以及在任意 Dart 2 預(yù)發(fā)行版中類似的 pub 命令都可以下載這個包。(這個包不會被用于 Dart 2 穩(wěn)定發(fā)行版,但你可以以后修復(fù)它。)
當(dāng)你更新一個已存在的包或發(fā)布一個新的包,為 SDK 版本指定一個<2.0.0的最高約束。例如:
# Works in 1.20.1+; might work in 2.0.0-dev:
sdk: '>=1.20.1 <2.0.0'
# Backward incompatible change requires at least 2.0.0-dev.1.2:
sdk: '>=2.0.0-dev.1.2 <2.0.0'
最后,你需要發(fā)布你的包的新版本來聲明 Dart 2 兼容性,大多數(shù)可能使用一個<3.0.0SDK 約束。因為,不兼容的改變可能出現(xiàn)在任意 Dart 2 預(yù)發(fā)行版,不要聲明 Dart 2 兼容性直到我們宣布這樣做是安全的。