Flutter 之 生命周期(三)

1、Fultter 生命周期

生命周期的作用:

  • 初始化一些數(shù)據(jù)、變量、狀態(tài)
  • 發(fā)送網(wǎng)絡(luò)請求
  • 監(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 不可變,在它的生命周期中,只會執(zhí)行構(gòu)造函數(shù)、build方法

1.2 StatefulWidget 生命周期

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

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

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

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

  • 2、執(zhí)行StatefulWidget的createState方法,來創(chuàng)建一個(gè)維護(hù)StatefulWidget的State對象;

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

  • 1、執(zhí)行State類的構(gòu)造方法(Constructor)來創(chuàng)建State對象;

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

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

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

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

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

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

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

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

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

  • 7、執(zhí)行didUpdateWidget方法是在當(dāng)父Widget觸發(fā)重建(rebuild)時(shí),系統(tǒng)會調(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會調(diào)用
    // 從其他對象中依賴一些數(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)會調(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

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

flutter: 5. _MSHomePageBodyState build

我們手動改變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è)屬性最主要的作用是為了記錄對應(yīng)的Element是否為空


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

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

最后編輯于
?著作權(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)容