和其餘的視圖框架好比android的Activity同樣,flutter中的視圖Widget也存在生命週期,生命週期的回調函數提如今了State上面。理解flutter的生命週期,對咱們寫出一個合理的控件相當重要。組件State的生命週期整理以下圖所示:android
大體能夠當作三個階段框架
這個函數不屬於生命週期,由於這個時候State的widget屬性爲空,若是要在構造函數中訪問widget的屬性是行不通的。可是構造函數必然是要第一個調用的。ide
/// Called when this object is inserted into the tree.
當插入渲染樹的時候調用,這個函數在生命週期中只調用一次。這裏能夠作一些初始化工做,好比初始化State的變量。函數
/// Called when a dependency of this [State] object changes.
這個函數會緊跟在initState以後調用,而且能夠調用BuildContext.inheritFromWidgetOfExactType,那麼BuildContext.inheritFromWidgetOfExactType的使用場景是什麼呢?最經典的應用場景是ui
new DefaultTabController(length: 3, child: new TabBar( tabs: [ "主頁","訂單","個人" ] .map( (data)=>new Text(data) ).toList(),
TabBar原本須要定義一個TabController,可是在外面套一層DefaultTabController就不須要定義TabContrller了,看下源碼:this
@override void didChangeDependencies() { super.didChangeDependencies(); _updateTabController(); _initIndicatorPainter(); } void _updateTabController() { final TabController newController = widget.controller ?? DefaultTabController.of(context); ...
注意到這裏DefaultTabController.of(context)spa
static TabController of(BuildContext context) { final _TabControllerScope scope = context.inheritFromWidgetOfExactType(_TabControllerScope); return scope?.controller; }
實際上就是調用BuildContext.inheritFromWidgetOfExactType,也就說在didChangeDependencies中,能夠跨組件拿到數據。3d
/// Called whenever the widget configuration changes.
當組件的狀態改變的時候就會調用didUpdateWidget,好比調用了setState.code
實際上這裏flutter框架會建立一個新的Widget,綁定本State,並在這個函數中傳遞老的Widget。blog
這個函數通常用於比較新、老Widget,看看哪些屬性改變了,並對State作一些調整。
須要注意的是,涉及到controller的變動,須要在這個函數中移除老的controller的監聽,並建立新controller的監聽。
好比仍是TabBar:
/// Called when this object is removed from the tree.
在dispose以前,會調用這個函數。
/// Called when this object is removed from the tree permanently.
一旦到這個階段,組件就要被銷燬了,這個函數通常會移除監聽,清理環境。
仍是TabBar:
階段 | 調用次數 | 是否支持setState |
構造函數 | 1 | 否 |
initState | 1 | 無效(使用setState和不使用同樣) |
didChangeDependencies | >=1 | 無效 |
didUpdateWidget | >=1 | 無效 |
deactivate | >=1 | 否 |
dispose | 1 | 否 |