Flutter 2.0 的發(fā)布帶來了很多的 break change
吴攒,特別是新增加的空聲明安全,相信不少大哥嘗鮮之后立馬反思自己“手賤” 砂蔽,事實上舊項目升級 Flutter 2.0 確實有很多兼容的點洼怔,但是“吃螃蟹”其實我們可以逐步拆解,比如“先蒸熟了再吃”左驾?
其實正如《 Dart 2.12 發(fā)布镣隶,穩(wěn)定空安全聲明和FFI版本》 里所說,升級到 Flutter 2.0 并不會強制要求你馬上使用空聲明安全 诡右,所以我們可以把整個升級適配過程拆解幾步來完成安岂,最終完成 2.0 的升級適配。
1帆吻、針對 API 的調(diào)整
首先你需要先將本地的 Flutter SDK 升級到 2.0 以上的版本域那,升級完成之后首先確保 Dart SDK 的 environment
小于 2.12.0
, 可以選中 2.10.0
之類的版本猜煮,如下所示的配置是不需要針對空聲明安全進行適配琉雳,接下來我們就可以針對 SDK API 的 break change
先進行適配調(diào)整样眠。
environment:
sdk: '>=2.10.0 <3.0.0'
首先你會應該遇到最多的應該是 List
對象的修改,因為 factory List
的函數(shù)已經(jīng)被 Deprecated
翠肘,所以你需要使用 []
或者 List.filled
來替換你原有的實現(xiàn)檐束,從這開始就是“體力活”了。
常見的還有 runZoned
的 onError
參數(shù)也被 Deprecated
束倍,需要使用 runZonedGuarded
來替代被丧。
一般使用
runZoned
的都是用于對Dart
層做錯誤信息收集。
Stack
控件的 overflow
參數(shù)也被 Deprecated
绪妹,需要替換為 clipBehavior
甥桂,比如以前的 Overflow.visible
可以修改為 Clip.none
,默認情況下是 Clip.hardEdge
邮旷。
FlatButton
也被標志為棄用黄选,需要替換成 TextButton
;類似的 RaisedButton
需要替換為 ElevatedButton
婶肩。
這里主要需要注意的是: FlatButton
和 RaisedButton
上的 padding
办陷、color
等方法現(xiàn)在需要使用 ButtonStyle
來設置。
類似的還有 Scaffold.of(builderContext).showSnackBar
方法需要替換為 ScaffoldMessenger.of(builderContext).showSnackBar
使用律歼。
最后還有:
Scaffold
的resizeToAvoidBottomPadding
參數(shù)正式取消民镜,需要使用resizeToAvoidBottomInset
參數(shù)替代。Theme.of(context, shadowThemeOnly: true)
的shadowThemeOnly
參數(shù)正式取消险毁。官方新增了
DateUtils
到'package:flutter/material.dart'
里制圈,可能會與你的項目里的DateUtils
命名沖突。
-
Localizations.localeOf(context, nullOk: true)
和MediaQuery.of(context, nullOk: true)
的nullOk
參數(shù)正式取消畔况。
大致上我遇到的 break change
或者棄用警告就是上面這些鲸鹦,調(diào)整完后在沒有打開空安全配置的情況下,是可以正常運行的跷跪。
當然你也可能遇到:修改完后依舊無法運行的情況馋嗜,因為還有第三方插件包依賴需要調(diào)整。
2域庇、針對依賴倉庫的調(diào)整
雖然 Flutter 2.0 沒有要求主項目一定使用空聲明安全嵌戈,但是對于插件的適配要求卻比價嚴格覆积,所以你仍可能需要升級一些 pub 倉庫的依賴來完成適配听皿。
前提是祈禱你使用插件包有適配
null-safety
。
如圖所示宽档,正常支持 null-safety
的包在 pub 官網(wǎng)上是有 Null safety 的標簽或者 nullsafety 的預覽版本尉姨,這時候只要修改你的依賴版本,使用支持空聲明安全的插件版本就可以了吗冤。
完了嗎又厉?明顯沒有九府!
因為大量的插件升級就可能帶來版本沖突,比如 analyzer
版本沖突覆致,在 json_serializable
和 built_value_generator
中他們分別依賴了不同的 analyzer
版本侄旬,所以會有版本沖突問題。
另外比如 build_runner
和 graphql
的版本之間存在 web_socket_channel
的沖突煌妈。
這些沖突要怎么解決呢儡羔?這里給大家展示使用 dependency_overrides
臨時解決這些沖突。
如下圖所示璧诵,可以看到在 dependency_overrides
下我強行使用了 analyzer: 1.1.0
和 web_socket_channel
汰蜘,這樣運行之后 analyzer
和 web_socket_channel
的版本會被強制指定,從而忽略沖突來解決無法運行的問題之宿。
另外在我的
dependency_overrides
里可以看到很多帶有#
的注解版本族操,這些版本都是在遇到?jīng)_突之后,為了成功運行一個個添加上去比被,之后在對應插件更新支持兼容后才注釋掉色难。
添加了 dependency_overrides
之后運行會有 Warning
提示,這部分忽略就行了姐赡。
3莱预、針對空聲明安全的調(diào)整
在完成上面兩個步驟,項目應該就可以在 Flutter 2.0 上運行项滑,那接下來就是把版本升級到空安全聲明的支持依沮,當然前提是你想要使用 null safety
。
升級到空安全聲明枪狂,推薦使用官方的 dart migrate
命令危喉,命令會生成一個可視化的界面,引導你將項目遷移到空安全聲明州疾,并且自動幫你覆蓋代碼辜限。
如果你還有插件沒有完全支持空安全聲明,那么可以使用
dart migrate --skip-import-check
來完成遷移严蓖。
運行后可以看到一個鏈接薄嫡,點擊如圖所示鏈接就可以打開引導界面,引導界面上可以看到每個文件會被修改位置和數(shù)量颗胡,你可以自己重新調(diào)整內(nèi)容后點擊刷新毫深,或者直接點擊 APPLY MIGRATION
按鍵,之后再到項目里進行修改毒姨。
相信我哑蔫,修改后肯定會有一堆報錯和警告,不要擔心,這是正常的闸迷,接下來就是“體力活”了嵌纲。
首先某些地方可能會被修改為如下圖所示代碼,你只需要對應修改回來就好腥沽,自動覆蓋的腳本確實有些傻逮走。
有時候某些 await
語法會被強行增加 as FutureOr
,如果你不需要改為原來的聲明就可以今阳。
還有比如 compute
方法中的 Function(_)
錯誤提示言沐,只需要改為對應分參數(shù)傳入,比如 Function(String? data)
就可以了酣栈。
有時候一些方法定義也會被強行修改险胰,比如 redux
相關(guān)的這些修改可能也會影響運行問題,所以只需要把 as
部分去除就可以了矿筝。
而比如這類方法報錯起便,一般就是提供的參數(shù)和使用參數(shù)對應不上,只需要添加上 ?
即可修復窖维。
最后有時也會使用 !
來暫時完成適配榆综,比如某個參數(shù)你確定不會為 null
,你可以在使用時通過 !
表示強行使用(就是任性不判空)铸史,比如下圖就是對 _dragOffset
和 notification.scrollDelta
的強行修改對比鼻疮。
可以看到這部分內(nèi)容也是純粹體力活,雖然自動覆蓋的靠譜程度肯定不高琳轿,還是需要一定的人工修改判沟,但是這個自動化過程大大提高了遷移的效率,而在代碼覆蓋之后崭篡,environment
的 sdk
也會自動修改為 >=2.12.0
挪哄。
空安全聲明遷移完成!
4琉闪、針對遷移中運行的調(diào)整
最后迹炼,到這里你可能會發(fā)現(xiàn),升級到 dart 1.12
之后颠毙,適配完 null safety
點 IDE 上的運行發(fā)現(xiàn)還是運行不起來斯入,比如下圖所示:
這是因為你還有沒有遷移完成的依賴包,但是有時候依賴包不是一時半會就能兼容完成蛀蜜,這時候應該如何適配運行呢刻两?
這時候就可以通過 flutter run --no-sound-null-safety
命令來運行調(diào)試項目,通過此命令運行的項目并不會使用空安全聲明校驗涵防,然后通過輸入 r
或者 R
等就可以完成 hotload
等調(diào)試操作闹伪。
如果需要 debug 代碼或者性能調(diào)試,還可以通過 chrome
瀏覽器打開 http://localhost:9100
地址壮池,然后把運行得到的 Observatory
地址如: http://127.0.0.1:62145/H1PrDXLbA3w=/
輸入到 Connect 輸入框偏瓤,這樣就可以打開 DartTools 進行調(diào)試。
最后不得不說椰憋, Flutter 2.0 算是 Flutter 新的起點厅克,希望新的版本能給你們帶來更穩(wěn)定和更便捷的開發(fā)體驗。