Flutter Widget 生命周期

前言

作為一名客戶端開發(fā),無論是Android/IOS,生命周期的概念深入骨髓,那么一個優(yōu)秀的跨平臺方案,F(xiàn)lutter Widget是怎么處理生命周期的呢,接下來就讓我們一起了解一下,以圖鎮(zhèn)樓。

Flutter Widget 生命周期

從圖中我們可以看到Flutter Widget的生命周期分為兩部分:一部分是Widget本身的周期,跟隨Widget在layer tree的狀態(tài)而改變,另一部分則是依賴于Native Application的生命周期。

實(shí)踐·驗(yàn)證

接下來我們通過實(shí)踐來驗(yàn)證一下真實(shí)的生命周期是否如圖中所示,以Android為例:

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    print('initState');
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.inactive:
        print('AppLifecycleState.inactive');
        break;
      case AppLifecycleState.paused:
        print('AppLifecycleState.paused');
        break;
      case AppLifecycleState.resumed:
        print('AppLifecycleState.resumed');
        break;
      case AppLifecycleState.detached:
        print('AppLifecycleState.detached');
        break;
    }

    super.didChangeAppLifecycleState(state);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    print('didChangeDependencies');
  }

  @override
  void didUpdateWidget(MyHomePage oldWidget) {
    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() {
    super.reassemble();
    print('reassemble');
  }

  @override
  void deactivate() {
    super.deactivate();
    print('deactivate');
  }

  @override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance.addObserver(this);
    print('dispose');
  }
}

1、創(chuàng)建一個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、跳轉(zhuǎn)到其他頁面執(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
  • initState:widget創(chuàng)建執(zhí)行的第一個方法,可以再里面初始化一些數(shù)據(jù),以及綁定控制器;

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

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

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

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

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

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

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

參考

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

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