欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flutter生命周期超詳細(xì)講解

 更新時(shí)間:2023年01月29日 08:53:04   作者:流星雨在線(xiàn)  
這篇文章主要為大家介紹了Flutter生命周期和App生命周期示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、組件生命周期

flutter組件只有兩種:有狀態(tài)和無(wú)狀態(tài)組件。由于無(wú)狀態(tài)組件效率高,如果不涉及到組件內(nèi)部的數(shù)據(jù)存儲(chǔ),盡量多的使用無(wú)狀態(tài)組件

1、StatelessWidget

build:組件渲染

調(diào)用次數(shù):1次

StatelessWidget是無(wú)狀態(tài)組件,生命周期只有一個(gè)build方法,很簡(jiǎn)單

2、StatefulWidget

flutter生命周期大體上可以分為三個(gè)階段:初始化、狀態(tài)變化、銷(xiāo)毀。

2.1、初始化階段

constructor:構(gòu)造方法

調(diào)用次數(shù):1次

createState:創(chuàng)建狀態(tài)

調(diào)用次數(shù):1次

在創(chuàng)建一個(gè)新的StatefulWidget,會(huì)首先調(diào)用這個(gè)方法, 這個(gè)生命周期是必須有的。

class LifeScreen extends StatefulWidget {
  LifeScreen({Key key}) : super(key: key);
  @override
  _LifeScreenState createState() => _LifeScreenState();
}

initState:初始化狀態(tài)

調(diào)用次數(shù):1次

這個(gè)生命周期是在該節(jié)點(diǎn)創(chuàng)建后調(diào)用的第一個(gè)方法。插入渲染樹(shù)時(shí)調(diào)用,只調(diào)用一次,widget創(chuàng)建執(zhí)行的第一個(gè)方法,這里可以做一些初始化工作,比如初始化State的變量。

2.2、狀態(tài)變化階段

mounted:是否在正常狀態(tài)中

只是一個(gè)值,不是方法

所有的節(jié)點(diǎn)都會(huì)有這個(gè)屬性,在buildContext被賦值并且該節(jié)點(diǎn)已經(jīng)在節(jié)點(diǎn)樹(shù)(the widget tree)上的時(shí)候,這個(gè)屬性的值會(huì)變成true。然后該屬性會(huì)一直保持true,直到dispose的方法被調(diào)用后會(huì)變成false.

addPostFrameCallback:渲染后回調(diào)

這個(gè)需要在initState() 內(nèi)被調(diào)用,示例如下:

import 'package:flutter/scheduler.dart';
@override
void initState() {
  super.initState();
  SchedulerBinding.instance.addPostFrameCallback((_) => {});
}

這個(gè)是在每一幀渲染完成后的回調(diào),只有在該節(jié)點(diǎn)構(gòu)建(build)完成后調(diào)用一次。

didChangeDependencies:父級(jí)結(jié)構(gòu)中的層級(jí)變化

調(diào)用次數(shù):多次

  • 初始化時(shí),在initState()之后立刻調(diào)用
  • 當(dāng)依賴(lài)的InheritedWidget rebuild,會(huì)觸發(fā)此接口被調(diào)用
  • 實(shí)測(cè)在組件可見(jiàn)狀態(tài)變化的時(shí)候會(huì)調(diào)用

build:組件渲染

調(diào)用次數(shù):多次

  • 初始化之后開(kāi)始繪制界面
  • setState觸發(fā)的時(shí)候會(huì)

didUpdateWidget:組件更新

調(diào)用次數(shù):多次

組件狀態(tài)改變時(shí)候調(diào)用

2.3、銷(xiāo)毀階段

deactivate:節(jié)點(diǎn)移除

當(dāng)State對(duì)象從樹(shù)中被移除時(shí),會(huì)調(diào)用此回調(diào),會(huì)在dispose之前調(diào)用。

頁(yè)面銷(xiāo)毀的時(shí)候會(huì)依次執(zhí)行:deactivate > dispose

dispose:節(jié)點(diǎn)銷(xiāo)毀

調(diào)用次數(shù):1次

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

在這個(gè)生命周期里需要取消訂閱(unsubscribe) streams和回收動(dòng)畫(huà)(dispose animations)等等,避免內(nèi)存泄漏。

reassemble

調(diào)用次數(shù):多次

在熱重載(hot reload)時(shí)會(huì)被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會(huì)被調(diào)用。

原因是

開(kāi)發(fā)階段:JIT (Just-in-Time,即時(shí)編譯),使用了jvm。

打包使用:AOT (Ahead-of-Time,預(yù)編譯),使用so庫(kù)直接運(yùn)行。

二、App生命周期

通過(guò)WidgetsBindingObserver的didChangeAppLifecycleState 來(lái)獲取。通過(guò)該接口可以獲取是生命周期在AppLifecycleState類(lèi)中。

示例:

class LoginTestPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _LoginTestPageState();
  }
}
class _LoginTestPageState extends State<LoginTestPage>
    with WidgetsBindingObserver {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
  }
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    print("--" + state.toString());
    switch (state) {
      case AppLifecycleState.inactive: // 處于這種狀態(tài)的應(yīng)用程序應(yīng)該假設(shè)它們可能在任何時(shí)候暫停。
        break;
      case AppLifecycleState.resumed:
        {} // 應(yīng)用程序可見(jiàn),前臺(tái)
        break;
      case AppLifecycleState.paused: // 應(yīng)用程序不可見(jiàn),后臺(tái)
        break;
      case AppLifecycleState.detached:
        // TODO: Handle this case.
        break;
    }
  }
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Container();
  }
}

resumed

可見(jiàn)并能響應(yīng)用戶(hù)的輸入,同安卓的onResume

inactive

處在并不活動(dòng)狀態(tài),無(wú)法處理用戶(hù)響應(yīng),同安卓的onPause

paused

不可見(jiàn)并不能響應(yīng)用戶(hù)的輸入,但是在后臺(tái)繼續(xù)活動(dòng)中,同安卓的onStop

App常見(jiàn)生命周期切換

初次打開(kāi)widget時(shí),不執(zhí)行AppLifecycleState的回調(diào);

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

從后臺(tái)到前臺(tái):AppLifecycleState inactive—>ApplifecycleState resumed

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

到此這篇關(guān)于Flutter生命周期超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Flutter生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論