Flutter生命周期超詳細講解
一、組件生命周期
flutter組件只有兩種:有狀態(tài)和無狀態(tài)組件。由于無狀態(tài)組件效率高,如果不涉及到組件內部的數據存儲,盡量多的使用無狀態(tài)組件
1、StatelessWidget
build:組件渲染
調用次數:1次
StatelessWidget是無狀態(tài)組件,生命周期只有一個build方法,很簡單
2、StatefulWidget
flutter生命周期大體上可以分為三個階段:初始化、狀態(tài)變化、銷毀。
2.1、初始化階段
constructor:構造方法
調用次數:1次
createState:創(chuàng)建狀態(tài)
調用次數:1次
在創(chuàng)建一個新的StatefulWidget,會首先調用這個方法, 這個生命周期是必須有的。
class LifeScreen extends StatefulWidget { LifeScreen({Key key}) : super(key: key); @override _LifeScreenState createState() => _LifeScreenState(); }
initState:初始化狀態(tài)
調用次數:1次
這個生命周期是在該節(jié)點創(chuàng)建后調用的第一個方法。插入渲染樹時調用,只調用一次,widget創(chuàng)建執(zhí)行的第一個方法,這里可以做一些初始化工作,比如初始化State的變量。
2.2、狀態(tài)變化階段
mounted:是否在正常狀態(tài)中
只是一個值,不是方法
所有的節(jié)點都會有這個屬性,在buildContext被賦值并且該節(jié)點已經在節(jié)點樹(the widget tree)上的時候,這個屬性的值會變成true。然后該屬性會一直保持true,直到dispose的方法被調用后會變成false.
addPostFrameCallback:渲染后回調
這個需要在initState() 內被調用,示例如下:
import 'package:flutter/scheduler.dart'; @override void initState() { super.initState(); SchedulerBinding.instance.addPostFrameCallback((_) => {}); }
這個是在每一幀渲染完成后的回調,只有在該節(jié)點構建(build)完成后調用一次。
didChangeDependencies:父級結構中的層級變化
調用次數:多次
- 初始化時,在initState()之后立刻調用
- 當依賴的InheritedWidget rebuild,會觸發(fā)此接口被調用
- 實測在組件可見狀態(tài)變化的時候會調用
build:組件渲染
調用次數:多次
- 初始化之后開始繪制界面
- setState觸發(fā)的時候會
didUpdateWidget:組件更新
調用次數:多次
組件狀態(tài)改變時候調用
2.3、銷毀階段
deactivate:節(jié)點移除
當State對象從樹中被移除時,會調用此回調,會在dispose之前調用。
頁面銷毀的時候會依次執(zhí)行:deactivate > dispose
dispose:節(jié)點銷毀
調用次數:1次
在deactivate()之后調用,當State對象從樹中被永久移除時調用;通常在此回調中釋放資源。
在這個生命周期里需要取消訂閱(unsubscribe) streams和回收動畫(dispose animations)等等,避免內存泄漏。
reassemble
調用次數:多次
在熱重載(hot reload)時會被調用,此回調在Release模式下永遠不會被調用。
原因是
開發(fā)階段:JIT (Just-in-Time,即時編譯),使用了jvm。
打包使用:AOT (Ahead-of-Time,預編譯),使用so庫直接運行。
二、App生命周期
通過WidgetsBindingObserver的didChangeAppLifecycleState 來獲取。通過該接口可以獲取是生命周期在AppLifecycleState類中。
示例:
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)的應用程序應該假設它們可能在任何時候暫停。 break; case AppLifecycleState.resumed: {} // 應用程序可見,前臺 break; case AppLifecycleState.paused: // 應用程序不可見,后臺 break; case AppLifecycleState.detached: // TODO: Handle this case. break; } } @override Widget build(BuildContext context) { // TODO: implement build return Container(); } }
resumed
可見并能響應用戶的輸入,同安卓的onResume
inactive
處在并不活動狀態(tài),無法處理用戶響應,同安卓的onPause
paused
不可見并不能響應用戶的輸入,但是在后臺繼續(xù)活動中,同安卓的onStop
App常見生命周期切換
初次打開widget時,不執(zhí)行AppLifecycleState的回調;
按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
從后臺到前臺:AppLifecycleState inactive—>ApplifecycleState resumed
back鍵退出應用: AppLifecycleState inactive—>AppLifecycleState paused
到此這篇關于Flutter生命周期超詳細講解的文章就介紹到這了,更多相關Flutter生命周期內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android Parcelable與Serializable詳解及區(qū)別
這篇文章主要介紹了Android Parcelable與Serializable詳解及區(qū)別的相關資料,需要的朋友可以參考下2017-01-01Android中imageView圖片放大縮小及旋轉功能示例代碼
這篇文章主要介紹了Android中imageView圖片放大縮小及旋轉功能示例代碼,需要的朋友可以參考下2017-08-08Android app開發(fā)中的Fragment入門學習教程
這篇文章主要介紹了Android app開發(fā)中的Fragment入門學習教程,包括Fragment的創(chuàng)建和XML布局文件中的Fragment定義等,需要的朋友可以參考下2016-02-02