经过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公开的数据进行交互。