一文詳解Flutter Widget和App的生命周期
一:StatefulWidget 生命周期
StatefulWidget 組件生命周期分為三組:
- 1.初始化期:createState() ,initState()
- 2.更新期:didChangeDependencies(),build(BuildContext context),didUpdateWidget()
- 3.銷毀期:deactivate(),dispose()
1.createState()
- (1)創(chuàng)建StatefulWidget之后調(diào)用的第一個(gè)方法
- (2)該方法是抽象方法 , 必須覆蓋重寫(xiě)該方法
2.initState()
- (1)該方法是創(chuàng)建 Widget 組件時(shí)除構(gòu)造方法之外的第一個(gè)方法
- (2) 對(duì)應(yīng) Android 中的 onCreate 方法 ; 對(duì)應(yīng) iOS 中的 viewDidLoad 方法
- (3)在該方法中執(zhí)行一些初始化操作
3.didChangeDependencies()
- 1)創(chuàng)建 Widget 組件時(shí) , 調(diào)用完 initState 方法后 , 調(diào)用該方法
- (2)InheritedWidget 相關(guān) ( 暫不涉及 ) ;
4.build()
- (1)調(diào)用完 didChangeDependencies 方法后調(diào)用該方法
- (2)調(diào)用 setState 方法之后 , 該方法也會(huì)被調(diào)用 ;
- (3)頁(yè)面每次渲染時(shí)都會(huì)調(diào)用該方法
5.didUpdateWidget()
- (1)該生命周期方法不經(jīng)常調(diào)用 , 只有在父容器組件重繪時(shí)才調(diào)用該方法
- (2)傳入的 oldWidget 參數(shù)是舊的組件信息 , 將當(dāng)前的 Widget 與舊的 Widget 進(jìn)行對(duì)比 , 如果不相等 , 便執(zhí)行額外操作 ;
6.deactivate()
該生命周期方法不經(jīng)常調(diào)用 , 只有在組件被移除時(shí)才調(diào)用
7.dispose()
組件被銷毀時(shí)調(diào)用 , 要在該方法中進(jìn)行資源的釋放與銷毀操作
8.reassemble()
此回調(diào)是專門(mén)為了開(kāi)發(fā)調(diào)試而提供的,在熱重載(hot reload)時(shí)會(huì)被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會(huì)被調(diào)用
import 'package:flutter/material.dart'; class TestSheng extends StatefulWidget { const TestSheng({Key? key}) : super(key: key); /// 1. 初始化期的生命周期函數(shù) /// 創(chuàng)建 StatefulWidget 之后調(diào)用的第一個(gè)方法 , /// 該方法是抽象方法 , 必須覆蓋 @override State<StatefulWidget> createState() => _TestShengState(); } class _TestShengState extends State<TestSheng> { /// 2. 初始化期的生命周期函數(shù) /// 該方法是創(chuàng)建 Widget 組件時(shí)除構(gòu)造方法之外的第一個(gè)方法 /// 該方法對(duì)應(yīng) Android 中的 onCreate 方法 /// 對(duì)應(yīng) iOS 中的 viewDidLoad 方法 /// 常用用法 : 在該方法中執(zhí)行一些初始化操作 @override void initState() { super.initState(); print("initState()"); } /// 3. 更新期的生命周期函數(shù) /// 方法調(diào)用時(shí)機(jī) : /// 創(chuàng)建 Widget 組件時(shí) , 調(diào)用完 initState 方法后 , 調(diào)用該方法 /// InheritedWidget 相關(guān) ( 暫不涉及 ) @override void didChangeDependencies() { super.didChangeDependencies(); print("didChangeDependencies()"); } /// 4. 更新期的生命周期函數(shù) /// 方法調(diào)用時(shí)機(jī) : /// 調(diào)用完 didChangeDependencies 方法后調(diào)用該方法 /// 調(diào)用 setState 方法之后 , 該方法也會(huì)被調(diào)用 ; /// 頁(yè)面每次渲染時(shí)都會(huì)調(diào)用該方法 @override Widget build(BuildContext context) { print("build()"); return Scaffold( appBar: AppBar( //標(biāo)題 title: Text("StatefulWidget 生命周期"), //回退 leading: BackButton(), ), body: Center( child: Column( children: <Widget>[ //點(diǎn)擊事件 RaisedButton( onPressed: (){ //回調(diào)生命周期 setState(() { }); }, child: Text("調(diào)用setState()方法"), ) ], ), ), ); } ///此回調(diào)是專門(mén)為了開(kāi)發(fā)調(diào)試而提供的,在熱重載(hot reload)時(shí)會(huì)被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會(huì)被調(diào)用 @override void reassemble() { super.reassemble(); print("reassemble()"); } /// 5. 更新期的生命周期函數(shù) /// 方法調(diào)用時(shí)機(jī) : 該生命周期方法不經(jīng)常調(diào)用 , 只有在父容器組件重繪時(shí)才調(diào)用該方法 /// 方法機(jī)制 : 傳入的 oldWidget 參數(shù)是舊的組件信息 , /// 將當(dāng)前的 Widget 與舊的 Widget 進(jìn)行對(duì)比 , 如果不相等 , 便執(zhí)行額外操作 /// 如 : 組件的屬性不相等 , 字段的值不相等 @override void didUpdateWidget(covariant TestSheng oldWidget) { super.didUpdateWidget(oldWidget); print("didUpdateWidget()"); } /// 6 . 銷毀期的生命周期函數(shù) /// 方法調(diào)用時(shí)機(jī) : 該生命周期方法不經(jīng)常調(diào)用 , 只有在組件被移除時(shí)才調(diào)用 /// 該方法在 dispose 方法之前被調(diào)用 @override void deactivate() { super.deactivate(); print("deactivate()"); } @override void dispose() { super.dispose(); print("dispose()"); } }
點(diǎn)擊運(yùn)行或者使用shift+F10,生命周期會(huì)走,調(diào)試模式會(huì)走一次熱重載
I/flutter (10876): initState()
I/flutter (10876): didChangeDependencies()
I/flutter (10876): build()
I/flutter (10876): reassemble()
I/flutter (10876): didUpdateWidget()
I/flutter (10876): build()
點(diǎn)擊熱重載和crl+\ 生命周期會(huì)走
I/flutter (10876): reassemble()
I/flutter (10876): didUpdateWidget()
I/flutter (10876): build()
點(diǎn)擊setState 會(huì)調(diào)用
I/flutter (10876): build()
二:StatelessWidget 組件生命周期函數(shù)
StatelessWidget 組件生命周期函數(shù) : 只有兩個(gè) , 分別是 createElement() , build() 兩個(gè)方法 ;
abstract class StatelessWidget extends Widget { /// Initializes [key] for subclasses. const StatelessWidget({ Key key }) : super(key: key); @override StatelessElement createElement() => StatelessElement(this); @protected Widget build(BuildContext context); }
以上就是一文詳解Flutter Widget和App的生命周期的詳細(xì)內(nèi)容,更多關(guān)于Flutter Widget App生命周期的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中Progress的簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android中Progress的簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05Flutter實(shí)現(xiàn)簡(jiǎn)單的下載按鈕動(dòng)畫(huà)
我們?cè)赼pp的開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)用到一些表示進(jìn)度類的動(dòng)畫(huà)效果,比如一個(gè)下載按鈕,那么在flutter中一個(gè)下載按鈕的動(dòng)畫(huà)應(yīng)該如何制作呢,一起來(lái)看看吧2023-05-05Android Drawable和Bitmap的轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了Android Drawable和Bitmap的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05Android Studio 3.5格式化布局代碼時(shí)錯(cuò)位、錯(cuò)亂bug的解決
這篇文章主要介紹了Android Studio 3.5格式化布局代碼時(shí)錯(cuò)位、錯(cuò)亂bug的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android中實(shí)現(xiàn)用命令行同步網(wǎng)絡(luò)時(shí)間
這篇文章主要介紹了Android中實(shí)現(xiàn)用命令行同步網(wǎng)絡(luò)時(shí)間,本文講解使用BusyBox實(shí)現(xiàn)同步網(wǎng)絡(luò)時(shí)間,并給出了詳細(xì)操作步驟,需要的朋友可以參考下2015-07-07很贊的引導(dǎo)界面效果Android控件ImageSwitcher實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android控件ImageSwitcher如何實(shí)現(xiàn)很贊的引導(dǎo)界面的具體代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Android 開(kāi)發(fā)系統(tǒng)自帶語(yǔ)音模塊應(yīng)用
本篇文章 主要介紹 Android 開(kāi)發(fā)自帶語(yǔ)音模塊實(shí)例,在開(kāi)發(fā)Android系統(tǒng)中會(huì)用到系統(tǒng)語(yǔ)音搜索模塊,這里給大家一個(gè)參考實(shí)例2016-07-07android 點(diǎn)擊EditText始終不彈出軟件鍵盤(pán)實(shí)現(xiàn)代碼
這篇文章主要介紹了android 點(diǎn)擊EditText始終不彈出軟件鍵盤(pán)實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11Android實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng),Spinner實(shí)現(xiàn)省市區(qū)的三級(jí)聯(lián)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07