Flutter 生命周期

Flutter跟安卓的Activity、iOS的ViewController一樣擁有自己的生命周期, Flutter中一切都是Widget,渲染方式有點像H5的DOM樹。

  先看生命周期圖:

image

Flutter生命周期可以分為3個階段:

1、實例化組件并添加到樹, 即Navigator.push;

2、狀態(tài)變化,即打開新的widget或者依賴的上級widget發(fā)生變化;

3、從樹中移除, 即Navigator.pop。

在Flutter中Widget都是不可變的, 但實際上需要根據(jù)對應(yīng)的狀態(tài)刷新Widget。 從而產(chǎn)生了StatelessWidget和StatefulWdiget, StatefulWidget是由2個對象Widget和State組成的。

為什么將State和Widget分開呢?

答案是性能, State管理狀態(tài)(可以理解為Controller),Widget是UI(即View)。 根據(jù)狀態(tài)變化每次生成Widget(即View)可以節(jié)省內(nèi)存,即不必每次創(chuàng)建狀態(tài)對象State。

構(gòu)造函數(shù):

同其它高級語言, 只執(zhí)行一次;

initState:

插入到渲染樹時調(diào)用,只執(zhí)行一次。(類似Android Fragment的onCreateView函數(shù))

didChangeDependencies:

1、在初始化initState后執(zhí)行; 2、顯示/關(guān)閉其它widget。 3、可執(zhí)行多次;

didUpdateWidget:

上級節(jié)點rebuild widget時, 即上級組件狀態(tài)發(fā)生變化時會觸發(fā)子widget執(zhí)行didUpdateWidget;

deative:

有點像Android的onStop函數(shù), 在打開新的Widget或回到這個widget時會執(zhí)行; 可執(zhí)行多次;

dispose:

類似于Android的onDestroy, 在執(zhí)行Navigator.pop后會調(diào)用該辦法, 表示組件已銷毀;

reassemble:

點擊閃電會執(zhí)行,只用于調(diào)試時的hot reload。 release版本不會執(zhí)行該函數(shù)。

常見業(yè)務(wù)場景:

Widget A打開Widget B: Navigator.push(B)

B構(gòu)造函數(shù)--->B initState--->B didChangeDependencies--->B build--->A deactive--->A didChangeDependencies.

Widget B退出: Navigator.pop

A deactive--->A didChangeDependencies--->A build--->B deactive--->B dispose

可以看出, Flutter打開、關(guān)閉Widget時跟安卓、iOS的時序一樣, 都是先處理即將顯示的界面。

activity生命周期和Flutter對應(yīng)關(guān)系:

Flutter提供了WidgetsBindingObserver來監(jiān)聽AppLifecycleState, 而AppLifecycleState有4種狀態(tài):

1、 resumed 界面可見, 同安卓的onResume。

2、inactive界面退到后臺或彈出對話框情況下, 即失去了焦點但仍可以執(zhí)行drawframe回調(diào);同安卓的onPause;

3、paused應(yīng)用掛起,比如退到后臺,失去了焦點且不會收到drawframe回調(diào);同安卓的onStop;

4、suspending, iOS中沒用,安卓里就是掛起,不會再執(zhí)行drawframe回調(diào);

下面是生命周期:

1、初次打開widget時,不執(zhí)行AppLifecycleState的回調(diào);

2、按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause

3、從后臺到前臺:AppLifecycleState inactive--->ApplifecycleState resumed

4、back鍵退出應(yīng)用: AppLifecycleState inactive--->AppLifecycleState paused

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  AppLifecycleState _lastLifecycleState;

  void dispose() {
    super.dispose();
    WidgetsBinding.instance.removeObserver(this);
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

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

  ...
}

如果還需要其它事件,則可以用EventChannel實現(xiàn), 從而補(bǔ)全Flutter的生命周期。

</article>

22人點贊

flutter系列文章

作者:三也視界
鏈接:http://www.itdecent.cn/p/7e8dff26f81a
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

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

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

  • 天天都酒天天都茶,已經(jīng)不知道是多少個月了。從沒想過牢騷,只怪自己不夠牛逼,在這大圈圈里,只懂一小半,但從未害怕面對...
    一夕秉閱讀 147評論 0 0
  • 昨夜做了一個有點荒謬的夢。 這個夢境泛著昏暗的底調(diào)。下大雪了,不是普通的雪——單片雪花碩大無比,大到堪比向...
    瑞采閱讀 201評論 0 1
  • 今天下午在觀看江老師的特色體育活動時,發(fā)生了一件事,挺讓我在意的。站在滑步車上通過道具時,有一個小女生沒...
    aa4cada5b7be閱讀 143評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,835評論 28 54

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