Flutter中的熱更新

首先來了解一下 JIT & AOT

JIT & AOT

JIT全稱是Just In Time,代碼可以在程序執(zhí)行時期編譯,因為要在程序執(zhí)行前進行分析、編譯,JIT編譯可能會導致程序執(zhí)行時間較慢;而AOT編譯,全稱Ahead Of Time,是在程序運行前就已經(jīng)編譯,從開發(fā)者修改代碼到編譯的過程較慢,但運行時不需要進行分析、編譯,因此執(zhí)行速度更快。

Flutter使用了獨特的編譯模式,開發(fā)階段下,使用Kernel Snapshot模式(對應(yīng)JIT編譯),將dart代碼生成標記化的源代碼,運行時編譯,解釋執(zhí)行;release階段,ios使用AOT編譯,編譯器將dart代碼生成匯編代碼,最終生成app.framwork,android使用了Core JIT編譯,dart轉(zhuǎn)化為二進制模式,在VM啟動前載入。

hot reload 原理

Flutter通過將新的代碼注入到正在運行的DartVM中,來實現(xiàn)Hot Reload這種神奇的效果,在DartVM將程序中的類結(jié)構(gòu)更新完成后,F(xiàn)lutter會立即重建整個控件樹,從而更新界面。

dart中的更新

觸發(fā)熱刷新時Flutter會檢測發(fā)生改變的Dart文件,將其同步到App私有緩存目錄下,DartVM加載并且修改對應(yīng)的類或者方法,重建控件樹后立即可以在設(shè)備上看到效果。

熱刷新限制

并不是所有的代碼改動都可以通過熱刷新來更新:

  • 編譯錯誤,如果修改后的Dart代碼無法通過編譯,F(xiàn)lutter會在控制臺報錯,這時需要修改對應(yīng)的代碼。

  • 控件類型從StatelessWidget到StatefulWidget的轉(zhuǎn)換,因為Flutter在執(zhí)行熱刷新時會保留程序原來的state,而某個控件從stageless→stateful后會導致Flutter重新創(chuàng)建控件時報錯“myWidget is not a subtype of StatelessWidget”,而從stateful→stateless會報錯“type 'myWidget' is not a subtype of type 'StatefulWidget' of 'newWidget'”。

  • 全局變量和靜態(tài)成員變量,這些變量不會在熱刷新時更新。

  • 修改了main函數(shù)中創(chuàng)建的根控件節(jié)點,F(xiàn)lutter在熱刷新后只會根據(jù)原來的根節(jié)點重新創(chuàng)建控件樹,不會修改根節(jié)點。

  • 某個類從普通類型轉(zhuǎn)換成枚舉類型,或者類型的泛型參數(shù)列表變化,都會使熱刷新失敗。

  • 熱刷新無法實現(xiàn)更新時,執(zhí)行一次熱重啟(Hot Restart)就可以全量更新所有代碼,同樣不需要重啟App,區(qū)別是restart會將所有Dart代碼打包同步到設(shè)備上,并且所有狀態(tài)都會重置

參考文檔

揭秘Flutter Hot Reload(原理篇)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容