相關(guān)文章:
- 創(chuàng)建分支命名為
flutter2_null-safety
刹碾,并切換到新分支。 - 項目中使用了
fvm
炮障,執(zhí)行fvm use stable
淤毛,使用Flutter
最新的stable
分支蛛砰。 - 執(zhí)行
flutter doctor
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[?] Flutter (Channel stable, 2.2.3, on macOS 11.5.1 20G80 darwin-x64, locale zh-Hans-CN)
[?] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[?] Xcode - develop for iOS and macOS
[?] Chrome - develop for the web
[?] Android Studio (version 2020.3)
[?] Connected device (2 available)
? No issues found!
- 查看
dart
版本儡蔓,是否為2.12
或更高
$ dart --version
fvm: running Dart from Flutter "stable"
Dart SDK version: 2.13.4 (stable) (Wed Jun 23 13:08:41 2021 +0200) on "macos_x64"
- 檢查所有依賴的遷移狀態(tài)
$ dart pub outdated --mode=null-safety
fvm: running Dart from Flutter "stable"
Showing dependencies that are currently not opted in to null-safety.
[?] indicates versions without null safety support.
[?] indicates versions opting in to null safety.
Package Name Current Upgradable Resolvable Latest
direct dependencies:
amap_location ?0.2.0 (git) - - ?0.2.0 (git)
audioplayers ?0.17.4 (git) - - ?0.17.4 (git)
azlistview ?0.1.2 - - ?2.0.0-nullsafety.0
badges ?1.2.0 - - ?2.0.1
barcode_scan ?2.0.2 - - ?3.0.1
cached_network_image ?2.5.1 - - ?3.1.0
chewie ?0.12.2 - - ?1.2.2
connectivity ?2.0.2 - - ?3.0.6
date_range_picker ?1.0.7 - - ?1.0.7
device_info ?1.0.0 - - ?2.0.2
dio ?3.0.10 - - ?4.0.0
event_bus ?1.1.1 - - ?2.0.0
exifdart ?0.7.0+3 - - ?0.8.0-dev.2
fdottedline ?1.0.1 - - ?1.0.1
flutter_app_badger ?1.1.2 - - ?1.2.0
...
...
...
dev_dependencies:
build_runner ?1.11.1 - - ?2.0.6
No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
依賴遷移優(yōu)先級
A依賴B优床,B依賴C像寒,遷移順序為:C > B > A烘豹。對本地引入的庫分析是否具備遷移條件
① 幾個自己定義的插件庫庫已經(jīng)創(chuàng)建了null-safety
分支做了遷移支持。
② 其他三方的庫也都找到了可替換了null-safety
庫诺祸。
③ 本地引入的插件携悯,替換為git方式引入,創(chuàng)建null-safety
分支筷笨,做遷移支持蚌卤。
以上所有插件,保證都具備遷移條件奥秆。
如果插件還沒遷移逊彭,使用以下第⑧條的方法先將插件遷移,遷移完之后构订,使用null-safety
分支侮叮。
talkingdata_appanalytics_plugin:
git:
url: http://*******/*******/app_analytics_sdk_flutter.git
ref: null-safety
- 開始遷移
①fvm use stable
②dart --version
確保使用的dart為最新版本
③ 運行dart pub outdated --mode=null-safety
以確保所有依賴為最新且空安全。
$ dart pub outdated --mode=null-safety
fvm: running Dart from Flutter "stable"
Showing dependencies that are currently not opted in to null-safety.
[?] indicates versions without null safety support.
[?] indicates versions opting in to null safety.
All your dependencies declare support for null-safety.
如果依賴沒有更新到最新版本悼瘾,比如以下:
$ dart pub outdated --mode=null-safety
fvm: running Dart from Flutter "stable"
Showing dependencies that are currently not opted in to null-safety.
[?] indicates versions without null safety support.
[?] indicates versions opting in to null safety.
Package Name Current Upgradable Resolvable Latest
direct dependencies:
path_provider ?1.6.22 - ?2.0.2 ?2.0.2
uuid ?2.2.2 - ?3.0.4 ?3.0.4
dev_dependencies:
http ?0.12.2 - ?0.13.3 ?0.13.3
No resolution was found. Try running `dart pub upgrade --null-safety --dry-run` to explore why.
3 dependencies are constrained to versions that are older than a resolvable version.
To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --null-safety`.
運行 dart pub upgrade --null-safety
將依賴升級至支持空安全的最新版本囊榜。 注意: 該命令會更改你的 pubspec.yaml
文件。
④ 在包含 pubspec.yaml
的目錄下亥宿,執(zhí)行 dart migrate
命令卸勺,啟動遷移工具。
$ dart migrate
fvm: running Dart from Flutter "stable"
Migrating /Users/yuanzhiying/Desktop/app_analytics_sdk_flutter
See https://dart.dev/go/null-safety-migration for a migration guide.
Note: more than one project found; migrating the top-level project.
Analyzing project...
No analysis issues found.
Generating migration suggestions...
Compiling instrumentation information...
View the migration suggestions by visiting:
http://127.0.0.1:52996/Users/yuanzhiying/Desktop/app_analytics_sdk_flutter?authToken=zbeBO82KY54%3D
Use this interactive web view to review, improve, or apply the results.
When finished with the preview, hit ctrl-c to terminate this process.
If you make edits outside of the web view (in your IDE), use the 'Rerun from
sources' action.
⑤ 訪問http://127.0.0.1:52996/Users/yuanzhiying/Desktop/app_analytics_sdk_flutter?authToken=zbeBO82KY54%3D
瀏覽器打開烫扼,根據(jù)提示或具體情況處理代碼曙求。
工具給推薦了默認的處理方法,點擊代碼,可以看到右側(cè)Proposed Edits
里有具體的說明悟狱。在遷移工具的 Edit Details
窗格中静浴,你可以通過 Add /*?*/ hint
和 Add /*!*/ hint
按鈕來添加提示標(biāo)記。
按下這些按鈕挤渐,相應(yīng)的標(biāo)記會立刻添加到代碼中苹享,并且 無法撤銷。如果你想刪除標(biāo)記浴麻,可以和平常一樣使用代碼編輯器刪除它得问。
就算遷移工具正在運行,你也可以使用編輯器添加提示標(biāo)記软免。由于你的代碼還未遷移到空安全椭赋,所以無法使用空安全的新特性。但是你可以進行與空安全無關(guān)的改動或杠,例如重構(gòu)哪怔。
當(dāng)你完成編輯后,點擊 Rerun from sources
進行更改向抢。
⑥ 只進行部分文件的遷移
盡管我們希望你能一次性完成遷移工作认境,但對于大體量的應(yīng)用或 package
而言并不是簡單的事。如果你想只遷移部分文件挟鸠,請將暫時不遷移的文件前方的綠色勾選框取消勾選叉信。稍后應(yīng)用遷移更改時,這些文件會加上 Dart 2.9
[版本注釋][version comment]艘希,其他內(nèi)容保持不變硼身。
更多有關(guān)漸進遷移空安全的內(nèi)容,請閱讀 非健全的空安全覆享。
⑦ 處理完之后佳遂,再次執(zhí)行dart migrate
$ dart migrate
fvm: running Dart from Flutter "stable"
Migrating /Users/yuanzhiying/Desktop/app_analytics_sdk_flutter
See https://dart.dev/go/null-safety-migration for a migration guide.
Note: more than one project found; migrating the top-level project.
Analyzing project...
All sources appear to be already migrated. Nothing to do.
9、遷移完成
非健全的空安全
一個 Dart
程序可以同時包含已經(jīng)是 空安全 和未遷移至空安全的庫撒顿。這些 混合模式的程序 會運行在 非健全的空安全 下丑罪。
為了在保持與傳統(tǒng)庫運行時的兼容性的同時,能為健全的空安全程序提供健全性凤壁,Dart
工具提供了以下兩種模式的支持:
- 以 非健全的空安全 運行的混合模式的程序吩屹。在運行時有可能出現(xiàn)
null
引用錯誤,但這只是因為一些null
值和可空類型在非空安全的庫中污染了空安全的代碼拧抖。 - 當(dāng)程序完全遷移至空安全煤搜,且它所依賴的庫 全部 都遷移完成后,它就在以 健全的空安全 運行唧席,擁有所有由健全性帶來的保證和編譯優(yōu)化擦盾。
逐步遷移
因為 Dart
支持混合模式的空安全嘲驾,所以你可以一個個遷移你的庫(通常是一個文件),同時能正常運行程序和測試厌衙。
我們推薦你 優(yōu)先遷移最下層的庫 —— 指的是沒有導(dǎo)入其他包的庫距淫。接著遷移直接依賴了下層庫的依賴庫绞绒。最后再遷移依賴項最多的庫婶希。
舉個例子,假設(shè)你的 lib/src/util.dart
導(dǎo)入了其他(空安全)的軟件包和核心庫蓬衡,但它沒有包含任何 import '<本地路徑>'
的引用喻杈。那么你應(yīng)當(dāng)優(yōu)先考慮遷移 util.dart
,然后遷移依賴了 util.dart
的文件狰晚。如果有一些循環(huán)引用的庫(例如 A
引用了 B
筒饰,B
引用了 C
,C
引用了 A
)壁晒,建議同時對它們進行遷移瓷们。
使用遷移工具
你可以使用 遷移工具 進行漸進遷移。如果你需要排除部分文件或文件夾秒咐,勾選綠色的勾選框谬晕。下方的截圖中,bin
文件夾的所有文件都已被排除携取。
每個不遷移的文件都會加上 2.9
語言版本的注釋攒钳。你可以之后再次運行 dart migrate
繼續(xù)遷移。已遷移的文件將顯示為禁用的勾選框雷滋,它們無法撤銷遷移更改不撑。
測試或運行混合版本的程序
想要測試或運行混合版本的代碼,你需要禁用健全的空安全晤斩。有兩種方式可以進行操作:
- 在
dart
和flutter
命令里焕檬,加入--no-sound-null-safety
標(biāo)記禁用。例如:
$ dart --no-sound-null-safety run
$ flutter run --no-sound-null-safety
- 或者澳泵,設(shè)定程序入口的語言版本 —— 包含
main()
函數(shù)的文件 —— 設(shè)定為2.9
揩页。在Flutter
應(yīng)用中,一般是lib/main.dart
烹俗。在命令行應(yīng)用中爆侣,一般是bin/<package 名稱>.dart
。同時你也可以設(shè)定test
下的文件幢妄,因為它們也包含程序入口兔仰。例如
// @dart=2.9
import 'src/my_app.dart';
main() {
//...
}
以上兩種方式的規(guī)避,對于 正在 增量遷移的過程非常有用蕉鸳,但這樣做意味著你并未在完全啟用空安全的情況下測試你的代碼乎赴。當(dāng)你完成增量遷移后忍法,也請記得將測試代碼 重新 遷移至空安全。