Flutter 之 生命周期(三)

1邻吭、Fultter 生命周期

生命周期的作用:

  • 初始化一些數(shù)據(jù)娱两、變量澈圈、狀態(tài)
  • 發(fā)送網(wǎng)絡(luò)請(qǐng)求
  • 監(jiān)聽事件
  • 管理內(nèi)存

1.1 StatelessWidget 生命周期

class MSHomePage extends StatelessWidget {
  MSHomePage() {
    print("Flutter: StatelessWidget 構(gòu)造函數(shù) 調(diào)用");
  }
  @override
  Widget build(BuildContext context) {
    print("Flutter: StatelessWidget build 調(diào)用");
    return Text("Hello World");
  }
}

StatelessWidget 不可變邑茄,在它的生命周期中蛋叼,只會(huì)執(zhí)行構(gòu)造函數(shù)落包、build方法

1.2 StatefulWidget 生命周期

在下圖中部蛇,灰色部分的內(nèi)容是Flutter內(nèi)部操作的,我們并不需要手動(dòng)去設(shè)置它們咐蝇;
白色部分表示我們可以去監(jiān)聽到或者可以手動(dòng)調(diào)用的方法

截屏2022-04-11 下午3.26.55.png

首先涯鲁,執(zhí)行StatefulWidget中相關(guān)的方法:

  • 1、執(zhí)行StatefulWidget的構(gòu)造函數(shù)(Constructor)來(lái)創(chuàng)建出StatefulWidget有序;

  • 2抹腿、執(zhí)行StatefulWidget的createState方法,來(lái)創(chuàng)建一個(gè)維護(hù)StatefulWidget的State對(duì)象旭寿;

其次警绩,調(diào)用createState創(chuàng)建State對(duì)象時(shí),執(zhí)行State類的相關(guān)方法:

  • 1盅称、執(zhí)行State類的構(gòu)造方法(Constructor)來(lái)創(chuàng)建State對(duì)象肩祥;

  • 2、執(zhí)行initState缩膝,我們通常會(huì)在這個(gè)方法中執(zhí)行一些數(shù)據(jù)初始化的操作混狠,或者也可能會(huì)發(fā)送網(wǎng)絡(luò)請(qǐng)求;

  • 注意:這個(gè)方法是重寫父類的方法疾层,必須調(diào)用super将饺,因?yàn)楦割愔袝?huì)進(jìn)行一些其他操作;

  • 并且如果你閱讀源碼,你會(huì)發(fā)現(xiàn)這里有一個(gè)注解(annotation):@mustCallSuper

  • 3予弧、執(zhí)行didChangeDependencies方法刮吧,這個(gè)方法在兩種情況下會(huì)調(diào)用

  • 情況一:調(diào)用initState會(huì)調(diào)用;

  • 情況二:從其他對(duì)象中依賴一些數(shù)據(jù)發(fā)生改變時(shí)掖蛤,比如前面我們提到的InheritedWidget(這個(gè)后面會(huì)講到)杀捻;

  • 4、Flutter執(zhí)行build方法坠七,來(lái)看一下我們當(dāng)前的Widget需要渲染哪些Widget水醋;

  • 5、當(dāng)前的Widget不再使用時(shí)彪置,會(huì)調(diào)用dispose進(jìn)行銷毀拄踪;

  • 6、手動(dòng)調(diào)用setState方法拳魁,會(huì)根據(jù)最新的狀態(tài)(數(shù)據(jù))來(lái)重新調(diào)用build方法惶桐,構(gòu)建對(duì)應(yīng)的Widgets;

  • 7潘懊、執(zhí)行didUpdateWidget方法是在當(dāng)父Widget觸發(fā)重建(rebuild)時(shí)姚糊,系統(tǒng)會(huì)調(diào)用didUpdateWidget方法

1.2.1 代碼演示
import 'package:flutter/material.dart';

void main(List<String> args) {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var curHomePage = MSHomePageBody();
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("聲明周期"),
        ),
        body: curHomePage,
        floatingActionButton: IconButton(
          icon: Icon(Icons.change_circle),
          onPressed: () {
            setState(() {
              curHomePage = MSHomePageBody();
            });
          },
        ),
      ),
    );
  }
}

class MSHomePageBody extends StatefulWidget {
  MSHomePageBody() {
    print("1. MSHomePageBody  構(gòu)造函數(shù)");
  }
  @override
  State<StatefulWidget> createState() {
    print("2. MSHomePageBody  createState");
    return _MSHomePageBodyState();
  }
}

class _MSHomePageBodyState extends State<MSHomePageBody> {
  int _counter = 0;
  _MSHomePageBodyState() {
    print("3. _MSHomePageBodyState 構(gòu)造函數(shù)");
  }

  @override
  void initState() {
    print("4. _MSHomePageBodyState initState");
    super.initState();
  }

  @override
  void didChangeDependencies() {
    // 調(diào)用時(shí)機(jī)
    // 調(diào)用initState會(huì)調(diào)用
    // 從其他對(duì)象中依賴一些數(shù)據(jù)發(fā)生改變時(shí)
    print("_MSHomePageBodyState didChangeDependencies");
    super.didChangeDependencies();
  }

  @override
  void didUpdateWidget(covariant MSHomePageBody oldWidget) {
    // 調(diào)用時(shí)機(jī)
    // 當(dāng)父Widget觸發(fā)重建(rebuild)時(shí),系統(tǒng)會(huì)調(diào)用didUpdateWidget方法
    print("_MSHomePageBodyState didUpdateWidget");
    super.didUpdateWidget(oldWidget);
  }

  @override
  Widget build(BuildContext context) {
    print("5. _MSHomePageBodyState build");
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: () {
            setState(() {
              _counter++;
            });
          },
          child: Text(
            "點(diǎn)擊",
            style: TextStyle(fontSize: 20),
          ),
        ),
        Text(
          "當(dāng)前計(jì)數(shù)$_counter",
          style: TextStyle(fontSize: 20),
        ),
      ],
    );
  }

  @override
  void dispose() {
    print("6. Flutter: _MSHomePageBodyState dispose");
    super.dispose();
  }
}

運(yùn)行App時(shí)授舟,打印如下:

flutter: 1. MSHomePageBody  構(gòu)造函數(shù)
flutter: 2. MSHomePageBody  createState
flutter: 3. _MSHomePageBodyState 構(gòu)造函數(shù)
flutter: 4. _MSHomePageBodyState initState
flutter: _MSHomePageBodyState didChangeDependencies
flutter: 5. _MSHomePageBodyState build

我們手動(dòng)改變counter狀態(tài)(點(diǎn)擊+按鈕)時(shí)救恨,打印如下

flutter: 5. _MSHomePageBodyState build

我們手動(dòng)改變curHomePage狀態(tài)(點(diǎn)擊底部按鈕)時(shí),MSHomePageBody的父Widget發(fā)生改變释树,打印如下:

flutter: 1. MSHomePageBody  構(gòu)造函數(shù)
flutter: _MSHomePageBodyState didUpdateWidget
flutter: 5. _MSHomePageBodyState build

1.3 生命周期的復(fù)雜版

1肠槽、mounted是State內(nèi)部設(shè)置的一個(gè)屬性。這個(gè)屬性是在我們創(chuàng)建完State調(diào)用initState之前奢啥,F(xiàn)lutter給我們的BuildContent掛載的一個(gè)屬性秸仙。這個(gè)屬性最主要的作用是為了記錄對(duì)應(yīng)的Element是否為空


截屏2022-04-11 下午4.29.41.png

2、dirty state的含義是臟的State
它實(shí)際是通過(guò)Element的屬性來(lái)標(biāo)記的桩盲;
將它標(biāo)記為dirty會(huì)等待下一次的重繪檢查寂纪,強(qiáng)制調(diào)用build方法來(lái)構(gòu)建我們的Widget;
3赌结、clean state的含義是干凈的State
它表示當(dāng)前build出來(lái)的Widget捞蛋,下一次重繪檢查時(shí)不需要重新build;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姑曙,一起剝皮案震驚了整個(gè)濱河市襟交,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伤靠,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異宴合,居然都是意外死亡焕梅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門卦洽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贞言,“玉大人,你說(shuō)我怎么就攤上這事阀蒂「么埃” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蚤霞,是天一觀的道長(zhǎng)酗失。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昧绣,這世上最難降的妖魔是什么规肴? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮夜畴,結(jié)果婚禮上拖刃,老公的妹妹穿的比我還像新娘。我一直安慰自己贪绘,他們只是感情好兑牡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著税灌,像睡著了一般均函。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上垄琐,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天边酒,我揣著相機(jī)與錄音,去河邊找鬼狸窘。 笑死墩朦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翻擒。 我是一名探鬼主播氓涣,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陋气!你這毒婦竟也來(lái)了劳吠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巩趁,失蹤者是張志新(化名)和其女友劉穎痒玩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蠢古,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年奴曙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片草讶。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洽糟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堕战,到底是詐尸還是另有隱情坤溃,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布嘱丢,位于F島的核電站薪介,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏屿讽。R本人自食惡果不足惜昭灵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伐谈。 院中可真熱鬧烂完,春花似錦、人聲如沸诵棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)履澳。三九已至嘶窄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間距贷,已是汗流浹背柄冲。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忠蝗,地道東北人现横。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像阁最,于是被迫代替她去往敵國(guó)和親戒祠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容