- 重中之重
備份好項目文件,甚至連已經加載好的flutter庫也可以備份。 - 環境包升級
2.1
不要直接換成flutter:3.0以上的版本,這樣做既有基本的庫兼容問題,又有空安全下的語法問題(整個項目中需要增加 late、?、!的語法錯誤,一片報錯的紅海/(ㄒoㄒ)/ )
2.2
將環境包升級到flutter:2.10.5,它是flutter:3.x前的最后一個版本。
Flutter SDK下載地址:https://docs.flutter.dev/install/archive#windows
在pubspec.yaml中配置dart sdk版本限制:sdk: ‘>=2.10.0 <3.0.0’
(不能直接配置>=2.12.0,2.12.0以上強制使用空安全語法)
environment:
sdk: ‘>=2.10.0 < 3.0.0’
-
解決由于更換環境后出現的庫版本不兼容問題
3.1
手動修改太麻煩時,可以運行命令行:dart fix --apply
。它能自動修復Dart代碼過時的方法調用、格式問題、或可被自動修正的小錯誤,但并不是全部。 -
進行空安全遷移前的準備(項目已經在flutter:2.10.5環境順利運行)
4.1
檢查項目中依賴庫是否支持空安全。運行命令:
dart pub outdated --mode=null-safety
未全部支持空安全會打印出哪些庫未支持,
第三列綠色是足夠支持空安全的版本,
第四列綠色是庫當前的最新版本它的環境可能是3.x。
將對應庫版本改為足夠支持空安全的版本就好。(不用命令行dart pub upgrade
為了避免升級到最新版本)
4.2
修復更改版本后的庫調用問題(dart fix --apply
可以用起來),保證項目能正常運行起來。
4.3
再次運行dart pub outdated --mode=null-safety
檢查,此時項目已經完全支持空安全了
- 開始空安全遷移
5.1
當第三方庫不能完全支持空安全時有命令行(這樣的操作常常會不完整或是遷移失敗)
dart migrate --skip-import-check //跳過依賴的三方庫是否支持空安全
–skip-import-check --ignore-exceptions //跳過依賴的三方庫是否支持空安全且忽略異常情況
所以項目完全支持空安全的情況下應該直接遷移,運行命令:
dart migrate
順利執行命令后會打印提供的遷移工具鏈接,在瀏覽器中打開。
點擊按鈕APPLY MIGRATION應用遷移到項目中,等待遷移執行完成(對于文件太多的項目手動遷移不可取)
當執行完成后,在Android Studiio代碼被自動更改。打開pubspec.yaml會看到SDK版本限制被改為了>=2.12.0
environment:
sdk: ‘>=2.12.0 < 3.0.0’
5.2
但項目中會有遷移工具無法修復的報錯。
一般都是空條件判斷的報錯,一條條修復。(比起整個項目都報紅好太多!)
報錯代碼示例:
int? _goodsQuantity;
if(condition == 1){_goodsQuantity += 1; //這句會報錯_goodsQuantity = (_goodsQuantity ?? 0) + 1; //改成這樣
}
當所有報錯解決項目能正常運行起來了,空安全遷移就完成了。
6.頁面報錯的修復
雖然空安全語法正確了項目跑起來了,但是在數據處理上不可避免的會出現邏輯上的空判斷沖突,此時有問題的頁面就會報錯。
需要把各個頁面點一點,耐心的走一遍整個app,修復這些bug。
一般是類型不匹配報錯,示例:
type ‘() => Null’ is not a subtype of type ‘(() => Future)?’ in type cast
type ‘String’ is not a subtype of type ‘String?’ in type cast
解決空安全后,再去升級flutter3.x版本會更方便。