Flutter 中的生命週期分析

本篇主要介紹Flutter中的相關生命週期 分爲 widget生命週期、app生命週期

Widget生命週期

flutter中widget主要分爲 StatelessWidget 和 StatefulWidget 兩種 二者生命週期不太一樣

StatelessWidget(無狀態)

如果一個控件自身狀態不會去改變,創建了就直接顯示,不會有色值、大小或者其他屬性的變化,這種widget一般都是繼承自StatelessWidget,常見的有Container、ScrollView等,生命週期只有 build

class Frog extends StatelessWidget {
  const Frog({ Key key }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return new Container(color: const Color(0xFF2DBD3A));
  }
}

build是用來創建widget的,但是因爲build在每次刷新時候都會調用,通常需要把業務邏輯寫到構造函數中

StatefulWidget (有狀態)

需要持有狀態 State,這裏麪包含了一系列生命週期方法

class YellowBird extends StatefulWidget {
  const YellowBird({ Key key }) : super(key: key);

  @override
  _YellowBirdState createState() => new _YellowBirdState();
}

class _YellowBirdState extends State<YellowBird> {
  @override
  Widget build(BuildContext context) {
    return new Container(color: const Color(0xFFFFE306));
  }
}

官網示意圖如下
image.png

在網上看到一個更加下詳細的

image.png

大致可以劃分3個階段:

  • 初始化

構造函數 > initState > didChangeDependencies > Widget build , 此時頁面加載完成。

  • 狀態變化
  • 組件移除

組件移除,例如頁面銷燬的時候會依次執行:deactivate > dispose

名稱 描述 調用次數
createState createState 是 StatefulWidget 裏創建 State 的方法,當要創建新的 StatefulWidget 的時候,會立即執行 createState,而且只執行一次 1次
initState initState 是 StatefulWidget 創建完後調用的第一個方法,而且只執行一次,類似於 Android 的 onCreate、iOS 的 viewDidLoad(),所以在這裏 View 並沒有渲染,但是這時 StatefulWidget 已經被加載到渲染樹裏了,這時 StatefulWidget 的 mount的值會變爲 true,直到 dispose調用的時候纔會變爲 false。可以在 initState裏做一些初始化的操作。 1次
didChangeDependencies 1、當 StatefulWidget 第一次創建的時候,didChangeDependencies方法會在 initState方法之後立即調用,之後當 StatefulWidget 刷新的時候,就不會調用了,
2、或者你的 StatefulWidget 依賴的 InheritedWidget 發生變化之後,didChangeDependencies纔會調用,所以 didChangeDependencies有可能會被調用多次。
1次或多次
build 在 StatefulWidget 第一次創建的時候,build方法會在 didChangeDependencies方法之後立即調用,另外一種會調用 build方法的場景是,每當 UI 需要重新渲染的時候(setState觸發),build都會被調用,所以 build會被多次調用,然後 返回要渲染的 Widget。千萬不要在 build裏做除了創建 Widget 之外的操作,因爲這個會影響 UI 的渲染效率 多次
didUpdateWidget 祖先節點rebuild widget時調用,當組件改變狀態時就會調用,
需要注意的是,涉及到controller的變更,需要在這個函數中移除老的controller的監聽,並創建新controller的監聽。
1次或多次
deactivate 當要將 State 對象從渲染樹中移除的時候,就會調用 deactivate生命週期,這標誌着 StatefulWidget 將要銷燬,但是有時候 State 不會被銷燬,而是重新插入到渲染樹種 1次或多次
dispose 當 View 不需要再顯示,從渲染樹中移除的時候,State 就會永久的從渲染樹中移除,就會調用 dispose生命週期,這時候就可以在 dispose裏做一些取消監聽、動畫的操作,和 initState是相反的 1次

這裏補充一個,**addPostFrameCallback,**是 StatefulWidge 渲染結束的回調,只會被調用一次,之後 StatefulWidget 需要刷新 UI 也不會被調用,addPostFrameCallback的使用方法是在 initState裏添加回調:

import 'package:flutter/scheduler.dart';
@override
void initState() {
  super.initState();
  SchedulerBinding.instance.addPostFrameCallback((_) => {});
}

App生命週期

在 window.dart中有枚舉類 AppLifecycleState

enum AppLifecycleState {
  resumed,
  
  inactive,
  
  paused,

  suspending,
}

如果想要知道Flutter App的生命週期,比如前臺、後臺就需要使用**WidgetsBindingObserver **使用方法如下

State的類mix WidgetsBindingObserver,覆寫didChangeAppLifecycleState

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
    @override
  	void initState(){
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }
  
  	@override
  	void dispose() {
    // TODO: implement dispose
    super.dispose();
    WidgetsBinding.instance.removeObserver(this);
  }
  
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    if (state == AppLifecycleState.paused) {
      // went to Background
    }
    if (state == AppLifecycleState.resumed) {
      // came back to Foreground
    }
  }
}

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章