一拖吼、Flutter?頁面生命周期
Flutter 頁面生命周期就是 Flutter 頁面組件 Widget 的生命周期 ;
頁面的組件就是 StatefulWidget 組件 和 StatelessWidget 組件 ;
1鳞上、StatelessWidget 組件生命周期函數
StatelessWidget 組件生命周期函數 :?只有兩個 , 分別是 createElement() , build() 兩個方法 ;
abstract class StatelessWidget extends Widget {
? /// Initializes [key] for subclasses.
? const StatelessWidget({ Key key }) : super(key: key);
? @override
? StatelessElement createElement() => StatelessElement(this);
? @protected
? Widget build(BuildContext context);
}
2、StatefulWidget 組件生命周期函數
StatefulWidget 組件生命周期分為三組 :
① 初始化期 : createState , initState ;
② 更新期 : didChangeDependencies , build , didUpdateWidget ;
③ 銷毀期 : deactivate , dispose ;
二吊档、StatefulWidget 組件生命周期
1篙议、createState
createState 函數 :
所處時期 :?初始化期的生命周期函數
調用時機 :?創(chuàng)建 StatefulWidget 之后調用的第一個方法 ;
抽象方法 :?該方法是抽象方法 , 必須覆蓋重寫該方法 ;
/// 1. 初始化期的生命周期函數
? /// 創(chuàng)建 StatefulWidget 之后調用的第一個方法 ,
? /// 該方法是抽象方法 , 必須覆蓋
? @override
? _WidgetLiftCyclePageState createState() => _WidgetLiftCyclePageState();
2、initState
initState 函數 :
所處時期 : 初始化期的生命周期函數
調用時機 : 該方法是創(chuàng)建 Widget 組件時除構造方法之外的第一個方法 ,
對應方法 : 對應 Android 中的 onCreate 方法 ; 對應 iOS 中的 viewDidLoad 方法 ;
常用用法 : 在該方法中執(zhí)行一些初始化操作 ;
/// 2. 初始化期的生命周期函數
? /// 該方法是創(chuàng)建 Widget 組件時除構造方法之外的第一個方法
? /// 該方法對應 Android 中的 onCreate 方法
? /// 對應 iOS 中的 viewDidLoad 方法
? /// 常用用法 : 在該方法中執(zhí)行一些初始化操作
? @override
? void initState() {
? ? print("initState");
? ? super.initState();
? }
3怠硼、didChangeDependencies
didChangeDependencies 函數 :
所處時期 : 更新期的生命周期函數 ;
調用時機 : ① 創(chuàng)建 Widget 組件時 , 調用完 initState 方法后 , 調用該方法 ; ② InheritedWidget 相關 ( 暫不涉及 ) ;
/// 3. 更新期的生命周期函數
? /// 方法調用時機 :
? /// ① 創(chuàng)建 Widget 組件時 , 調用完 initState 方法后 , 調用該方法
? /// ② InheritedWidget 相關 ( 暫不涉及 )
? @override
? void didChangeDependencies() {
? ? /// 該方法在開始處必須調用父類的方法
? ? super.didChangeDependencies();
? ? print("didChangeDependencies");
? }
4鬼贱、build
build 函數 :
所處時期 : 更新期的生命周期函數 ;
調用時機 : ① 調用完 didChangeDependencies 方法后調用該方法 ; ② 調用 setState 方法之后 , 該方法也會被調用 ;
方法作用 : 頁面每次渲染時都會調用該方法 ;
/// 4. 更新期的生命周期函數
? /// 方法調用時機 :
? /// ① 調用完 didChangeDependencies 方法后調用該方法
? /// ② 調用 setState 方法之后 , 該方法也會被調用 ;
? /// 頁面每次渲染時都會調用該方法
? @override
? Widget build(BuildContext context) {
? ? print("build");
? ? return Scaffold(
? ? ? appBar: AppBar(
? ? ? ? // 標題
? ? ? ? title: Text("StatefulWidget 頁面生命周期"),
? ? ? ? // 回退按鈕
? ? ? ? leading: BackButton(),
? ? ? ),
? ? ? body: Center(
? ? ? ? child: Column(
? ? ? ? ? children: <Widget>[
? ? ? ? ? ? RaisedButton(
? ? ? ? ? ? ? // 點擊事件
? ? ? ? ? ? ? onPressed: (){
? ? ? ? ? ? ? ? // 回調更新期 生命周期函數
? ? ? ? ? ? ? ? setState(() {
? ? ? ? ? ? ? ? });
? ? ? ? ? ? ? },
? ? ? ? ? ? ? child: Text("調用 setState() 方法"),
? ? ? ? ? ? ),
? ? ? ? ? ],
? ? ? ? ),
? ? ? ),
? ? );
? }
5、didUpdateWidget
didUpdateWidget 函數 :
所處時期 : 更新期的生命周期函數 ;
調用時機 : 該生命周期方法不經常調用 , 只有在父容器組件重繪時才調用該方法 ;
方法機制 : 傳入的 oldWidget 參數是舊的組件信息 , 將當前的 Widget 與舊的 Widget 進行對比 , 如果不相等 , 便執(zhí)行額外操作 ;
/// 5. 更新期的生命周期函數
? /// 方法調用時機 : 該生命周期方法不經常調用 , 只有在父容器組件重繪時才調用該方法
? /// 方法機制 : 傳入的 oldWidget 參數是舊的組件信息 ,
? /// 將當前的 Widget 與舊的 Widget 進行對比 , 如果不相等 , 便執(zhí)行額外操作
? /// 如 : 組件的屬性不相等 , 字段的值不相等
? @override
? void didUpdateWidget(WidgetLiftCyclePage oldWidget) {
? ? super.didUpdateWidget(oldWidget);
? ? print("didUpdateWidget");
? }
6香璃、deactivate
deactivate 函數 :
所處時期 :?銷毀期的生命周期函數 ;
調用時機 :?該生命周期方法不經常調用 , 只有在組件被移除時才調用 ;
/// 6 . 銷毀期的生命周期函數
? /// 方法調用時機 : 該生命周期方法不經常調用 , 只有在組件被移除時才調用
? /// 該方法在 dispose 方法之前被調用
? @override
? void deactivate() {
? ? super.deactivate();
? ? print("deactivate");
? }
7这难、dispose
dispose 函數 :
所處時期 :?銷毀期的生命周期函數 ;
調用時機 :?組件被銷毀時調用 , 要在該方法中進行資源的釋放與銷毀操作 ;