Flutter生命周期超詳細(xì)講解
一、組件生命周期
flutter組件只有兩種:有狀態(tài)和無(wú)狀態(tài)組件。由于無(wú)狀態(tài)組件效率高,如果不涉及到組件內(nèi)部的數(shù)據(jù)存儲(chǔ),盡量多的使用無(wú)狀態(tài)組件
1、StatelessWidget
build:組件渲染
調(diào)用次數(shù):1次
StatelessWidget是無(wú)狀態(tài)組件,生命周期只有一個(gè)build方法,很簡(jiǎn)單
2、StatefulWidget
flutter生命周期大體上可以分為三個(gè)階段:初始化、狀態(tài)變化、銷(xiāo)毀。
2.1、初始化階段
constructor:構(gòu)造方法
調(diào)用次數(shù):1次
createState:創(chuàng)建狀態(tài)
調(diào)用次數(shù):1次
在創(chuàng)建一個(gè)新的StatefulWidget,會(huì)首先調(diào)用這個(gè)方法, 這個(gè)生命周期是必須有的。
class LifeScreen extends StatefulWidget { LifeScreen({Key key}) : super(key: key); @override _LifeScreenState createState() => _LifeScreenState(); }
initState:初始化狀態(tài)
調(diào)用次數(shù):1次
這個(gè)生命周期是在該節(jié)點(diǎn)創(chuàng)建后調(diào)用的第一個(gè)方法。插入渲染樹(shù)時(shí)調(diào)用,只調(diào)用一次,widget創(chuàng)建執(zhí)行的第一個(gè)方法,這里可以做一些初始化工作,比如初始化State的變量。
2.2、狀態(tài)變化階段
mounted:是否在正常狀態(tài)中
只是一個(gè)值,不是方法
所有的節(jié)點(diǎn)都會(huì)有這個(gè)屬性,在buildContext被賦值并且該節(jié)點(diǎn)已經(jīng)在節(jié)點(diǎn)樹(shù)(the widget tree)上的時(shí)候,這個(gè)屬性的值會(huì)變成true。然后該屬性會(huì)一直保持true,直到dispose的方法被調(diào)用后會(huì)變成false.
addPostFrameCallback:渲染后回調(diào)
這個(gè)需要在initState() 內(nèi)被調(diào)用,示例如下:
import 'package:flutter/scheduler.dart'; @override void initState() { super.initState(); SchedulerBinding.instance.addPostFrameCallback((_) => {}); }
這個(gè)是在每一幀渲染完成后的回調(diào),只有在該節(jié)點(diǎn)構(gòu)建(build)完成后調(diào)用一次。
didChangeDependencies:父級(jí)結(jié)構(gòu)中的層級(jí)變化
調(diào)用次數(shù):多次
- 初始化時(shí),在initState()之后立刻調(diào)用
- 當(dāng)依賴(lài)的InheritedWidget rebuild,會(huì)觸發(fā)此接口被調(diào)用
- 實(shí)測(cè)在組件可見(jiàn)狀態(tài)變化的時(shí)候會(huì)調(diào)用
build:組件渲染
調(diào)用次數(shù):多次
- 初始化之后開(kāi)始繪制界面
- setState觸發(fā)的時(shí)候會(huì)
didUpdateWidget:組件更新
調(diào)用次數(shù):多次
組件狀態(tài)改變時(shí)候調(diào)用
2.3、銷(xiāo)毀階段
deactivate:節(jié)點(diǎn)移除
當(dāng)State對(duì)象從樹(shù)中被移除時(shí),會(huì)調(diào)用此回調(diào),會(huì)在dispose之前調(diào)用。
頁(yè)面銷(xiāo)毀的時(shí)候會(huì)依次執(zhí)行:deactivate > dispose
dispose:節(jié)點(diǎn)銷(xiāo)毀
調(diào)用次數(shù):1次
在deactivate()之后調(diào)用,當(dāng)State對(duì)象從樹(shù)中被永久移除時(shí)調(diào)用;通常在此回調(diào)中釋放資源。
在這個(gè)生命周期里需要取消訂閱(unsubscribe) streams和回收動(dòng)畫(huà)(dispose animations)等等,避免內(nèi)存泄漏。
reassemble
調(diào)用次數(shù):多次
在熱重載(hot reload)時(shí)會(huì)被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會(huì)被調(diào)用。
原因是
開(kāi)發(fā)階段:JIT (Just-in-Time,即時(shí)編譯),使用了jvm。
打包使用:AOT (Ahead-of-Time,預(yù)編譯),使用so庫(kù)直接運(yùn)行。
二、App生命周期
通過(guò)WidgetsBindingObserver的didChangeAppLifecycleState 來(lái)獲取。通過(guò)該接口可以獲取是生命周期在AppLifecycleState類(lèi)中。
示例:
class LoginTestPage extends StatefulWidget { @override State<StatefulWidget> createState() { // TODO: implement createState return _LoginTestPageState(); } } class _LoginTestPageState extends State<LoginTestPage> with WidgetsBindingObserver { @override void initState() { // TODO: implement initState super.initState(); } @override void didChangeAppLifecycleState(AppLifecycleState state) async { print("--" + state.toString()); switch (state) { case AppLifecycleState.inactive: // 處于這種狀態(tài)的應(yīng)用程序應(yīng)該假設(shè)它們可能在任何時(shí)候暫停。 break; case AppLifecycleState.resumed: {} // 應(yīng)用程序可見(jiàn),前臺(tái) break; case AppLifecycleState.paused: // 應(yīng)用程序不可見(jiàn),后臺(tái) break; case AppLifecycleState.detached: // TODO: Handle this case. break; } } @override Widget build(BuildContext context) { // TODO: implement build return Container(); } }
resumed
可見(jiàn)并能響應(yīng)用戶(hù)的輸入,同安卓的onResume
inactive
處在并不活動(dòng)狀態(tài),無(wú)法處理用戶(hù)響應(yīng),同安卓的onPause
paused
不可見(jiàn)并不能響應(yīng)用戶(hù)的輸入,但是在后臺(tái)繼續(xù)活動(dòng)中,同安卓的onStop
App常見(jiàn)生命周期切換
初次打開(kāi)widget時(shí),不執(zhí)行AppLifecycleState的回調(diào);
按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
從后臺(tái)到前臺(tái):AppLifecycleState inactive—>ApplifecycleState resumed
back鍵退出應(yīng)用: AppLifecycleState inactive—>AppLifecycleState paused
到此這篇關(guān)于Flutter生命周期超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Flutter生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)自動(dòng)填寫(xiě)獲取驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)填寫(xiě)獲取驗(yàn)證碼功能,感興趣的小伙伴們可以參考一下2016-03-03Android Activity切換動(dòng)畫(huà)詳解及實(shí)例
這篇文章主要介紹了Android Activity切換動(dòng)畫(huà)overridePendingTransition詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03Android Parcelable與Serializable詳解及區(qū)別
這篇文章主要介紹了Android Parcelable與Serializable詳解及區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-01-01Android答題APP的設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android答題APP的設(shè)計(jì)與實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Android中Glide庫(kù)的使用小技巧總結(jié)
Glide是 Google推薦的圖片加載庫(kù),相信大家都不陌生,這篇文章主要給大家總結(jié)介紹了關(guān)于Android中Glide庫(kù)的使用小技巧,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11Android中imageView圖片放大縮小及旋轉(zhuǎn)功能示例代碼
這篇文章主要介紹了Android中imageView圖片放大縮小及旋轉(zhuǎn)功能示例代碼,需要的朋友可以參考下2017-08-08Android app開(kāi)發(fā)中的Fragment入門(mén)學(xué)習(xí)教程
這篇文章主要介紹了Android app開(kāi)發(fā)中的Fragment入門(mén)學(xué)習(xí)教程,包括Fragment的創(chuàng)建和XML布局文件中的Fragment定義等,需要的朋友可以參考下2016-02-02