與iOS的ViewController、Android的Activity一樣,F(xiàn)lutter中的Widget也存在生命周期,并且通過State來提現(xiàn)。而App則是一個特殊的Widget,除了需要處理視圖顯示的各個階段,還需要應對應用從啟動到退出所經(jīng)歷的各個狀態(tài)。
網(wǎng)站建設哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、重慶小程序開發(fā)公司、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了遂溪免費建站歡迎大家使用!
State的生命周期,指的是在用戶參與的情況查下,其關聯(lián)的Widget所經(jīng)歷的從創(chuàng)建到顯示再到更新最后到停止,直至銷毀的各個過程階段。
這些不同的階段涉及到的特定的任務處理,正確理解State的生命周期至關重要,State的生命周期流程圖圖,如下所示:
從圖中可以看到,State的生命周期可以分為3個階段:創(chuàng)建、更新、銷毀。下面將介紹每一個階段的具體流程
State初始化時會依次執(zhí)行:構造方法 - initState - didChangeDependencies - build,隨后完成頁面渲染
Widget的狀態(tài)更新,主要由3個方法觸發(fā):setState、didChangeDependencies與didUpdateWidget。
一旦這三個方法被調(diào)用,F(xiàn)lutter就回銷毀舊的Widget,并調(diào)用build方法重建Widget
組件銷毀相對比較簡單,組件被移除,或者頁面銷毀的時候,系統(tǒng)會調(diào)用deactivate和dispose這兩個方法來移除或銷毀組件
下面這張表格也可以幫助我們理解記憶這些調(diào)用實際
視圖的生命周期,定義了視圖的加載到構建的全過程,其回調(diào)機制能夠確保我們可以更具視圖的狀態(tài)選擇合適的時間做恰當?shù)氖虑椋鳤pp的生命周期,則定義了App從啟動到退出的全過程
在原生Android、iOS開發(fā)中,有時我們需要再對應的App生命周期事件中做相應的處理,比如App從后臺進入前臺,從前臺退出后臺,或者在UI繪制完成后做一些處理。
這樣的需求,在原生開發(fā)中,可以通過重寫Activity、ViewController生命周期回調(diào)方法,或者是注冊應用程序的相關通知來兼容App的生命周期并做相應的處理。而在Flutter中,我們可以利用WidgetsBindingObserver類,來實現(xiàn)同樣的需求。
下面我們看看WidgetsBindingObserver中具體有哪些回調(diào)函數(shù):
didChangeAppLifecycleState回調(diào)函數(shù)中,有一個參數(shù)類型為AppLifecycleState的枚舉類型,這個枚舉類型是Flutter對App生命周期狀態(tài)的封裝,它的常用狀態(tài)包括:
可以將App切前后臺,控制臺輸出的App狀態(tài),可以發(fā)現(xiàn):
我們可以通過下面的這張圖直觀的了解狀態(tài)切換過程
除了需要監(jiān)聽App的生命周期回調(diào)做相應處理外,根據(jù)不同的需求,我們需要再組件宣講之后做一些與顯示安全相關的操作,在iOS中,可以通過GCD的方法,讓操作在下一個RunLoop執(zhí)行,在Android中,可以通過View.post()插入消息隊列,來保證在組件渲染后進行相關操作。在Flutter中實現(xiàn)同樣的需求會更簡單:使用WidgetsBinding來實現(xiàn)即可
WidgetsBinding提供了單詞Frame繪制回調(diào)和實時Frame繪制回調(diào)兩種機制來滿足不同的需求場景:
Flutter跟安卓的Activity、iOS的ViewController一樣擁有自己的生命周期, Flutter中一切都是Widget,渲染方式有點像H5的DOM樹。
Flutter生命周期可以分為3個階段:
1、實例化組件并添加到樹, 即Navigator.push;
2、狀態(tài)變化,即打開新的widget或者依賴的上級widget發(fā)生變化;
3、從樹中移除, 即Navigator.pop。
在Flutter中Widget都是不可變的, 但實際上需要根據(jù)對應的狀態(tài)刷新Widget。 從而產(chǎn)生了StatelessWidget和StatefulWdiget, StatefulWidget是由2個對象Widget和State組成的。
為什么將State和Widget分開呢?
答案是性能, State管理狀態(tài)(可以理解為Controller),Widget是UI(即View)。 根據(jù)狀態(tài)變化每次生成Widget(即View)可以節(jié)省內(nèi)存,即不必每次創(chuàng)建狀態(tài)對象State。
構造函數(shù):
同其它高級語言, 只執(zhí)行一次;
initState:
插入到渲染樹時調(diào)用,只執(zhí)行一次。(類似Android Fragment的onCreateView函數(shù))
didChangeDependencies:
1、在初始化initState后執(zhí)行; 2、顯示/關閉其它widget。 3、可執(zhí)行多次;
didUpdateWidget:
上級節(jié)點rebuild widget時, 即上級組件狀態(tài)發(fā)生變化時會觸發(fā)子widget執(zhí)行didUpdateWidget;
deative:
有點像Android的onStop函數(shù), 在打開新的Widget或回到這個widget時會執(zhí)行; 可執(zhí)行多次;
dispose:
類似于Android的onDestroy, 在執(zhí)行Navigator.pop后會調(diào)用該辦法, 表示組件已銷毀;
reassemble:
點擊閃電會執(zhí)行,只用于調(diào)試時的hot reload。 release版本不會執(zhí)行該函數(shù)。
常見業(yè)務場景:
Widget A打開Widget B: Navigator.push(B)
B構造函數(shù)---B initState---B didChangeDependencies---B build---A deactive---A didChangeDependencies.
Widget B退出: Navigator.pop
A deactive---A didChangeDependencies---A build---B deactive---B dispose
可以看出, Flutter打開、關閉Widget時跟安卓、iOS的時序一樣, 都是先處理即將顯示的界面。
activity生命周期和Flutter對應關系:
Flutter提供了WidgetsBindingObserver來監(jiān)聽AppLifecycleState, 而AppLifecycleState有4種狀態(tài):
1、 resumed 界面可見, 同安卓的onResume。
2、inactive界面退到后臺或彈出對話框情況下, 即失去了焦點但仍可以執(zhí)行drawframe回調(diào);同安卓的onPause;
3、paused應用掛起,比如退到后臺,失去了焦點且不會收到drawframe回調(diào);同安卓的onStop;
4、suspending, iOS中沒用,安卓里就是掛起,不會再執(zhí)行drawframe回調(diào);
下面是生命周期:
1、初次打開widget時,不執(zhí)行AppLifecycleState的回調(diào);
2、按home鍵或Power鍵, AppLifecycleState inactive----AppLifecycleState pause
3、從后臺到前臺:AppLifecycleState inactive---ApplifecycleState resumed
4、back鍵退出應用: AppLifecycleState inactive---AppLifecycleState paused
華為手機會檢測到部分應用存在的風險,并加入風險管控,如果需要將應用從風險中心移除,可在應用設置里將應用設置為信任軟件并移除風險管控。
不要使用Android studio4.1以上的版本打包,使用studio 3.5版本打包
get方法獲取數(shù)據(jù),封裝存儲和移除方法用于操作數(shù)據(jù)緩存列表(需要優(yōu)化,僅參考)
在Widget銷毀之前將WebView的監(jiān)聽和view銷毀掉。
flutter生命周期大體上可以分為三個階段:初始化、狀態(tài)變化、銷毀。
1、初始化階段
對應執(zhí)行構造方法和initState時候2、狀態(tài)變化階段
開新的widget或者調(diào)用setState方法的時候
3、銷毀階段
deactivate和dispose
二、生命周期階段執(zhí)行的函數(shù)
1、initState調(diào)用次數(shù):1次
插入渲染樹時調(diào)用,只調(diào)用一次,widget創(chuàng)建執(zhí)行的第一個方法,這里可以做一些初始化工作,比如初始化State的變量。2、didChangeDependencies調(diào)用次數(shù):多次
初始化時,在initState()之后立刻調(diào)用
當依賴的InheritedWidgetrebuild,會觸發(fā)此接口被調(diào)用。實測在組件可見狀態(tài)變化的時候會調(diào)用
3、build調(diào)用次數(shù):多次初始化之后開始繪制界面。setState觸發(fā)的時候會
4、didUpdateWidget調(diào)用次數(shù):多次組件狀態(tài)改變時候調(diào)用。
5、deactivate當State對象從樹中被移除時,會調(diào)用此回調(diào),會在dispose之前調(diào)用。頁面銷毀的時候會依次執(zhí)行:deactivatedispose
6、dispose調(diào)用次數(shù):1次當State對象從樹中被永久移除時調(diào)用;通常在此回調(diào)中釋放資源。
7、reassemble在熱重載(hotreload)時會被調(diào)用,此回調(diào)在Release模式下永遠不會被調(diào)用。
當前文章:移除flutter,移除粉絲
新聞來源:http://chinadenli.net/article6/dsdssog.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、虛擬主機、網(wǎng)站設計、面包屑導航、外貿(mào)建站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)