經過build()渲染bash
State初始化時會依次執行 : 構造函數 > initState > didChangeDependencies > Widget build , 此時頁面加載完成。app
調用次數:1次框架
這個函數嚴格意義上來說不屬於生命週期的一部分,由於這個時候State的widget屬性爲空,沒法在構造函數中訪問widget的屬性 。可是構造函數必然是要第一個調用的。能夠在這一部分接收前一個頁面傳遞過來的數據。less
調用次數:1次ide
當插入渲染樹的時候調用,這個函數在生命週期中只調用一次。這裏能夠作一些初始化工做,好比初始化State的變量。函數
在這個方法中,上下文context可用,但你還不能真正使用它,由於框架尚未徹底將狀態與它相關聯ui
initState()方法完成後,State對象如今已初始化,上下文可用。this
這個函數會緊跟在initState以後調用,而且能夠調用BuildContext.inheritFromWidgetOfExactType, 也就說在didChangeDependencies中,能夠跨組件拿到數據spa
在此階段,因爲上下文context可用,您可使用它。code
調用次數:屢次
初始化以後開始繪製界面,當setState觸發的時候會再次被調用
這個函數通常用於比較新、老Widget,看看哪些屬性改變了,並對State作一些調整。
須要注意的是,涉及到controller的變動,須要在這個函數中移除老的controller的監聽,並建立新controller的監聽。
組件移除,例如頁面銷燬的時候會依次執行:deactivate > dispose
在dispose以前,會調用這個函數。實測在組件課件狀態變化的時候會調用,當組件卸載時也會先一步dispose調用。
調用次數:1次
一旦到這個階段,組件就要被銷燬了,這個函數通常會移除監聽,清理環境。
State連接到一個BuildContext,BuildContext連接到Widget的一個實例
Widget State類訪問其任何變量
print(widget.title);
複製代碼
父Widget能夠經過如下方式訪問其子級的狀態
SnackBar是Scaffold的子Widget
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
new Scaffold(
key: _scaffoldKey,
appBar: new AppBar(
title: new Text(widget.title == null ? 'ADD' : 'EDIT'),
),
body: new Container(
padding: EdgeInsets.all(20.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
new Container(
margin: EdgeInsets.fromLTRB(0, 20, 0, 0),
child: new RaisedButton(
color: Colors.purple,
textColor: Color(0xFFFFFFFF),
onPressed: () {
_scaffoldKey.currentState.showSnackBar(
SnackBar(content: Text('Not supported.'))
);
},
child: new Text('保存'),
),
)
],
),
)
);
複製代碼
floatingActionButton: ScaffoldButton(
onPressedButton: () {
_incrementCounter();
},
));
class ScaffoldButton extends StatelessWidget {
ScaffoldButton({this.onPressedButton});
final VoidCallback onPressedButton;
@override
Widget build(BuildContext context) {
return FloatingActionButton(
onPressed: () {
print(
'FloatingActionButton onPressed context hashcode = ${context.hashCode}');
Scaffold.of(context).showSnackBar(
SnackBar(content: Text('I am context from Scaffold')));
onPressedButton();
},
tooltip: 'Increment',
child: new Icon(Icons.add),
);
}
}
複製代碼
final MyExposingWidget widget = context.ancestorWidgetOfExactType(MyExposingWidget);
final MyExposingWidgetState state = widget?.myState;
複製代碼
InheritedWidget是一個特殊的Widget,您能夠將其做爲另外一個子樹的父級放在Widgets樹中。該子樹的全部小部件都必須可以與該InheritedWidget公開的數據進行交互。