本篇主要介紹Flutter中的相關生命週期 分爲 widget生命週期、app生命週期html
flutter中widget主要分爲 StatelessWidget 和 StatefulWidget 兩種 兩者生命週期不太同樣app
若是一個控件自身狀態不會去改變,建立了就直接顯示,不會有色值、大小或者其餘屬性的變化,這種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
須要持有狀態 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));
}
}
複製代碼
官網示意圖以下
動畫
在網上看到一個更加下詳細的ui
大體能夠劃分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((_) => {});
}
複製代碼
在 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
}
}
}
複製代碼