Flutter 中的生命週期分析

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

Widget生命週期

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

StatelessWidget(無狀態)

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

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在每次刷新時候都會調用,一般須要把業務邏輯寫到構造函數中ide

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

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

image.png

大體能夠劃分3個階段:this

  • 初始化

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

  • 狀態變化
  • 組件移除

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

名稱 描述 調用次數
createState createState 是 StatefulWidget 裏建立 State 的方法,當要建立新的 StatefulWidget 的時候,會當即執行 createState,並且只執行一次 1次
initState initState 是 StatefulWidget 建立完後調用的第一個方法,並且只執行一次,相似於 Android 的 onCreate、iOS 的 viewDidLoad(),因此在這裏 View 並無渲染,可是這時 StatefulWidget 已經被加載到渲染樹裏了,這時 StatefulWidget 的 mount的值會變爲 true,直到 dispose調用的時候纔會變爲 false。能夠在 initState裏作一些初始化的操做。 1次
didChangeDependencies 一、當 StatefulWidget 第一次建立的時候,didChangeDependencies方法會在 initState方法以後當即調用,以後當 StatefulWidget 刷新的時候,就不會調用了,
二、或者你的 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
    }
  }
}
複製代碼

# 參考
相關文章
相關標籤/搜索