Flutter生命周期超詳細講解
一、組件生命周期
flutter組件只有兩種:有狀態(tài)和無狀態(tài)組件。由于無狀態(tài)組件效率高,如果不涉及到組件內(nèi)部的數(shù)據(jù)存儲,盡量多的使用無狀態(tài)組件
1、StatelessWidget
build:組件渲染
調(diào)用次數(shù):1次
StatelessWidget是無狀態(tài)組件,生命周期只有一個build方法,很簡單
2、StatefulWidget
flutter生命周期大體上可以分為三個階段:初始化、狀態(tài)變化、銷毀。

2.1、初始化階段
constructor:構造方法
調(diào)用次數(shù):1次
createState:創(chuàng)建狀態(tài)
調(diào)用次數(shù):1次
在創(chuàng)建一個新的StatefulWidget,會首先調(diào)用這個方法, 這個生命周期是必須有的。
class LifeScreen extends StatefulWidget {
LifeScreen({Key key}) : super(key: key);
@override
_LifeScreenState createState() => _LifeScreenState();
}
initState:初始化狀態(tài)
調(diào)用次數(shù):1次
這個生命周期是在該節(jié)點創(chuàng)建后調(diào)用的第一個方法。插入渲染樹時調(diào)用,只調(diào)用一次,widget創(chuàng)建執(zhí)行的第一個方法,這里可以做一些初始化工作,比如初始化State的變量。
2.2、狀態(tài)變化階段
mounted:是否在正常狀態(tài)中
只是一個值,不是方法
所有的節(jié)點都會有這個屬性,在buildContext被賦值并且該節(jié)點已經(jīng)在節(jié)點樹(the widget tree)上的時候,這個屬性的值會變成true。然后該屬性會一直保持true,直到dispose的方法被調(diào)用后會變成false.
addPostFrameCallback:渲染后回調(diào)
這個需要在initState() 內(nèi)被調(diào)用,示例如下:
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
這個是在每一幀渲染完成后的回調(diào),只有在該節(jié)點構建(build)完成后調(diào)用一次。
didChangeDependencies:父級結構中的層級變化
調(diào)用次數(shù):多次
- 初始化時,在initState()之后立刻調(diào)用
- 當依賴的InheritedWidget rebuild,會觸發(fā)此接口被調(diào)用
- 實測在組件可見狀態(tài)變化的時候會調(diào)用
build:組件渲染
調(diào)用次數(shù):多次
- 初始化之后開始繪制界面
- setState觸發(fā)的時候會
didUpdateWidget:組件更新
調(diào)用次數(shù):多次
組件狀態(tài)改變時候調(diào)用
2.3、銷毀階段
deactivate:節(jié)點移除
當State對象從樹中被移除時,會調(diào)用此回調(diào),會在dispose之前調(diào)用。
頁面銷毀的時候會依次執(zhí)行:deactivate > dispose
dispose:節(jié)點銷毀
調(diào)用次數(shù):1次
在deactivate()之后調(diào)用,當State對象從樹中被永久移除時調(diào)用;通常在此回調(diào)中釋放資源。
在這個生命周期里需要取消訂閱(unsubscribe) streams和回收動畫(dispose animations)等等,避免內(nèi)存泄漏。
reassemble
調(diào)用次數(shù):多次
在熱重載(hot reload)時會被調(diào)用,此回調(diào)在Release模式下永遠不會被調(diào)用。
原因是
開發(fā)階段:JIT (Just-in-Time,即時編譯),使用了jvm。
打包使用:AOT (Ahead-of-Time,預編譯),使用so庫直接運行。
二、App生命周期
通過WidgetsBindingObserver的didChangeAppLifecycleState 來獲取。通過該接口可以獲取是生命周期在AppLifecycleState類中。
示例:
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)的應用程序應該假設它們可能在任何時候暫停。
break;
case AppLifecycleState.resumed:
{} // 應用程序可見,前臺
break;
case AppLifecycleState.paused: // 應用程序不可見,后臺
break;
case AppLifecycleState.detached:
// TODO: Handle this case.
break;
}
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Container();
}
}
resumed
可見并能響應用戶的輸入,同安卓的onResume
inactive
處在并不活動狀態(tài),無法處理用戶響應,同安卓的onPause
paused
不可見并不能響應用戶的輸入,但是在后臺繼續(xù)活動中,同安卓的onStop
App常見生命周期切換
初次打開widget時,不執(zhí)行AppLifecycleState的回調(diào);
按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
從后臺到前臺:AppLifecycleState inactive—>ApplifecycleState resumed
back鍵退出應用: AppLifecycleState inactive—>AppLifecycleState paused
到此這篇關于Flutter生命周期超詳細講解的文章就介紹到這了,更多相關Flutter生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android Parcelable與Serializable詳解及區(qū)別
這篇文章主要介紹了Android Parcelable與Serializable詳解及區(qū)別的相關資料,需要的朋友可以參考下2017-01-01
Android中imageView圖片放大縮小及旋轉功能示例代碼
這篇文章主要介紹了Android中imageView圖片放大縮小及旋轉功能示例代碼,需要的朋友可以參考下2017-08-08
Android app開發(fā)中的Fragment入門學習教程
這篇文章主要介紹了Android app開發(fā)中的Fragment入門學習教程,包括Fragment的創(chuàng)建和XML布局文件中的Fragment定義等,需要的朋友可以參考下2016-02-02

