flutter State的生命周期

首先來張圖

image.png

代碼打印這些方法在何時(shí)執(zhí)行

class _LifeDemoState extends State<LifeDemo>
         with WidgetsBindingObserver {

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    print('initState');
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print(state.toString());
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    print('didChangeDependencies');
  }

  @override
  void didUpdateWidget(LifeDemo oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  }

  @override
  Widget build(BuildContext context) {
    print('build');
    // TODO: implement build
    return MaterialApp(
      home: Center(
          child: GestureDetector(
        child: new Text('lifeCycle'),
        onTap: () {
          Navigator.of(context)
              .push(new MaterialPageRoute(builder: (BuildContext c) {
            return new Text('sdfs');
          }));
        },
      )),
    );
  }
  @override
  void reassemble() {
    // TODO: implement reassemble
    super.reassemble();
    print('reassemble');
  }
  @override
  void deactivate() {
    // TODO: implement deactivate
    super.deactivate();
    print('deactivate');
  }
  
  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    WidgetsBinding.instance.addObserver(this);
    print('dispose');
  }
}
1、創(chuàng)建一個(gè)wedget到顯示 打印結(jié)果如下
01-15 14:06:44.751 19005-19025/com.example.flutterapp I/flutter: initState
01-15 14:06:44.751 19005-19025/com.example.flutterapp I/flutter: didChangeDependencies
01-15 14:06:44.752 19005-19025/com.example.flutterapp I/flutter: build
2、退出這個(gè)頁面執(zhí)行
01-15 14:08:40.956 19005-19561/com.example.flutterapp I/flutter: deactivate
01-15 14:08:40.970 19005-19561/com.example.flutterapp I/flutter: dispose
3、點(diǎn)擊熱重載按鈕
01-15 14:09:55.467 19005-19561/com.example.flutterapp I/flutter: reassemble
01-15 14:09:55.476 19005-19561/com.example.flutterapp I/flutter: didUpdateWidget
01-15 14:09:55.476 19005-19561/com.example.flutterapp I/flutter: build
4、app由顯示切換到后臺(home狀態(tài))
01-15 14:11:10.062 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.inactive
01-15 14:11:10.524 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.paused
5、app由后臺切回前臺
01-15 14:11:54.836 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.inactive
01-15 14:11:54.837 19005-19561/com.example.flutterapp I/flutter: AppLifecycleState.resumed

各個(gè)方法的解釋:
initState:widget創(chuàng)建執(zhí)行的第一個(gè)方法,可以再里面初始化一些數(shù)據(jù),以及綁定控制器 如下代碼所示

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _scrollController=new ScrollController();
    print('initState');
  }

didChangeDependencies:當(dāng)State對象的依賴發(fā)生變化時(shí)會被調(diào)用;例如:在之前build() 中包含了一個(gè)InheritedWidget,然后在之后的build() 中InheritedWidget發(fā)生了變化,那么此時(shí)InheritedWidget的子widget的didChangeDependencies()回調(diào)都會被調(diào)用。InheritedWidget這個(gè)widget可以由父控件向子控件共享數(shù)據(jù),案例可以參考 scoped_model開源庫。

build :它主要是用于構(gòu)建Widget子樹的。

reassemble:此回調(diào)是專門為了開發(fā)調(diào)試而提供的,在熱重載(hot reload)時(shí)會被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會被調(diào)用。

didUpdateWidget:當(dāng)樹rebuid的時(shí)候會調(diào)用該方法。

deactivate:當(dāng)State對象從樹中被移除時(shí),會調(diào)用此回調(diào)。

dispose():當(dāng)State對象從樹中被永久移除時(shí)調(diào)用;通常在此回調(diào)中釋放資源。

注:

代碼中的didChangeAppLifecycleState方法復(fù)寫需要State with WidgetsBindingObserver這個(gè)抽象類

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容