flutter 生命周期

StatelessWidget

初始化

build

经过build()渲染bash

StatefulWidget

初始化

State初始化时会依次执行 : 构造函数 > initState > didChangeDependencies > Widget build , 此时页面加载完成。app

构造函数

调用次数:1次框架

这个函数严格意义上来说不属于生命周期的一部分,由于这个时候State的widget属性为空,没法在构造函数中访问widget的属性 。可是构造函数必然是要第一个调用的。能够在这一部分接收前一个页面传递过来的数据。less

intState

调用次数:1次ide

当插入渲染树的时候调用,这个函数在生命周期中只调用一次。这里能够作一些初始化工做,好比初始化State的变量。函数

在这个方法中,上下文context可用,但你还不能真正使用它,由于框架尚未彻底将状态与它相关联ui

initState()方法完成后,State对象如今已初始化,上下文可用。this

didChangeDependencies

  • 初始化时,在initState()以后马上调用
  • 当依赖的InheritedWidget rebuild,会触发此接口被调用

这个函数会紧跟在initState以后调用,而且能够调用BuildContext.inheritFromWidgetOfExactType, 也就说在didChangeDependencies中,能够跨组件拿到数据spa

在此阶段,因为上下文context可用,您可使用它。code

运行时

build

调用次数:屡次

初始化以后开始绘制界面,当setState触发的时候会再次被调用

didUpdateWidget

这个函数通常用于比较新、老Widget,看看哪些属性改变了,并对State作一些调整。

须要注意的是,涉及到controller的变动,须要在这个函数中移除老的controller的监听,并建立新controller的监听。

组件移除

组件移除,例如页面销毁的时候会依次执行:deactivate > dispose

deactivate

在dispose以前,会调用这个函数。实测在组件课件状态变化的时候会调用,当组件卸载时也会先一步dispose调用。

dispose

调用次数:1次

hot reload

reassemble

一旦到这个阶段,组件就要被销毁了,这个函数通常会移除监听,清理环境。

State

State连接到一个BuildContext,BuildContext连接到Widget的一个实例

widget

Widget State类访问其任何变量

print(widget.title);
复制代码

currentState

父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('保存'),
          ),
        )
      ],
    ),
  )
);
复制代码

还有一种也能够实现相似currentState的功能

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),
    );
  }
}
复制代码

祖先Widget

final MyExposingWidget widget = context.ancestorWidgetOfExactType(MyExposingWidget);
final MyExposingWidgetState state = widget?.myState;
复制代码

InheritedWidget

InheritedWidget是一个特殊的Widget,您能够将其做为另外一个子树的父级放在Widgets树中。该子树的全部小部件都必须可以与该InheritedWidget公开的数据进行交互。

相关文章
相关标签/搜索