Flutter項目遷移到Null Safety


相關(guān)文章:


  1. 創(chuàng)建分支命名為flutter2_null-safety刹碾,并切換到新分支。
  2. 項目中使用了fvm炮障,執(zhí)行fvm use stable淤毛,使用Flutter最新的stable分支蛛砰。
  3. 執(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!

  1. 查看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"
  1. 檢查所有依賴的遷移狀態(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.
  1. 依賴遷移優(yōu)先級
    A依賴B优床,B依賴C像寒,遷移順序為:C > B > A烘豹。

  2. 對本地引入的庫分析是否具備遷移條件
    ① 幾個自己定義的插件庫庫已經(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
  1. 開始遷移
    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ù)提示或具體情況處理代碼曙求。

image.png

工具給推薦了默認的處理方法,點擊代碼,可以看到右側(cè)Proposed Edits里有具體的說明悟狱。在遷移工具的 Edit Details 窗格中静浴,你可以通過 Add /*?*/ hintAdd /*!*/ hint 按鈕來添加提示標(biāo)記。

按下這些按鈕挤渐,相應(yīng)的標(biāo)記會立刻添加到代碼中苹享,并且 無法撤銷。如果你想刪除標(biāo)記浴麻,可以和平常一樣使用代碼編輯器刪除它得问。

就算遷移工具正在運行,你也可以使用編輯器添加提示標(biāo)記软免。由于你的代碼還未遷移到空安全椭赋,所以無法使用空安全的新特性。但是你可以進行與空安全無關(guān)的改動或杠,例如重構(gòu)哪怔。

當(dāng)你完成編輯后,點擊 Rerun from sources 進行更改向抢。

image.png

⑥ 只進行部分文件的遷移
盡管我們希望你能一次性完成遷移工作认境,但對于大體量的應(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 引用了 CC 引用了 A)壁晒,建議同時對它們進行遷移瓷们。

使用遷移工具

你可以使用 遷移工具 進行漸進遷移。如果你需要排除部分文件或文件夾秒咐,勾選綠色的勾選框谬晕。下方的截圖中,bin 文件夾的所有文件都已被排除携取。

image.png

每個不遷移的文件都會加上 2.9 語言版本的注釋攒钳。你可以之后再次運行 dart migrate 繼續(xù)遷移。已遷移的文件將顯示為禁用的勾選框雷滋,它們無法撤銷遷移更改不撑。

測試或運行混合版本的程序

想要測試或運行混合版本的代碼,你需要禁用健全的空安全晤斩。有兩種方式可以進行操作:

  • dartflutter 命令里焕檬,加入 --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)你完成增量遷移后忍法,也請記得將測試代碼 重新 遷移至空安全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榕吼,一起剝皮案震驚了整個濱河市饿序,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羹蚣,老刑警劉巖原探,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異顽素,居然都是意外死亡咽弦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門胁出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來型型,“玉大人,你說我怎么就攤上這事全蝶∧炙猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵抑淫,是天一觀的道長绷落。 經(jīng)常有香客問我,道長丈冬,這世上最難降的妖魔是什么嘱函? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮埂蕊,結(jié)果婚禮上往弓,老公的妹妹穿的比我還像新娘。我一直安慰自己蓄氧,他們只是感情好函似,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著喉童,像睡著了一般撇寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堂氯,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天蔑担,我揣著相機與錄音,去河邊找鬼咽白。 笑死啤握,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晶框。 我是一名探鬼主播排抬,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼懂从,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蹲蒲?” 一聲冷哼從身側(cè)響起番甩,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎届搁,沒想到半個月后缘薛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咖祭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年掩宜,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔫骂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片么翰。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辽旋,靈堂內(nèi)的尸體忽然破棺而出浩嫌,到底是詐尸還是另有隱情,我是刑警寧澤补胚,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布码耐,位于F島的核電站,受9級特大地震影響溶其,放射性物質(zhì)發(fā)生泄漏骚腥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一瓶逃、第九天 我趴在偏房一處隱蔽的房頂上張望束铭。 院中可真熱鬧,春花似錦厢绝、人聲如沸契沫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懈万。三九已至,卻和暖如春靶病,著一層夾襖步出監(jiān)牢的瞬間会通,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工娄周, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涕侈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓昆咽,卻偏偏與公主長得像驾凶,于是被迫代替她去往敵國和親牙甫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容