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公開的數據進行交互。

相關文章
相關標籤/搜索