網站首頁 編程語言 正文
一、組件生命周期
flutter組件只有兩種:有狀態和無狀態組件。由于無狀態組件效率高,如果不涉及到組件內部的數據存儲,盡量多的使用無狀態組件
1、StatelessWidget
build:組件渲染
調用次數:1次
StatelessWidget是無狀態組件,生命周期只有一個build方法,很簡單
2、StatefulWidget
flutter生命周期大體上可以分為三個階段:初始化、狀態變化、銷毀。
2.1、初始化階段
constructor:構造方法
調用次數:1次
createState:創建狀態
調用次數:1次
在創建一個新的StatefulWidget,會首先調用這個方法, 這個生命周期是必須有的。
class LifeScreen extends StatefulWidget {
LifeScreen({Key key}) : super(key: key);
@override
_LifeScreenState createState() => _LifeScreenState();
}
initState:初始化狀態
調用次數:1次
這個生命周期是在該節點創建后調用的第一個方法。插入渲染樹時調用,只調用一次,widget創建執行的第一個方法,這里可以做一些初始化工作,比如初始化State的變量。
2.2、狀態變化階段
mounted:是否在正常狀態中
只是一個值,不是方法
所有的節點都會有這個屬性,在buildContext被賦值并且該節點已經在節點樹(the widget tree)上的時候,這個屬性的值會變成true。然后該屬性會一直保持true,直到dispose的方法被調用后會變成false.
addPostFrameCallback:渲染后回調
這個需要在initState() 內被調用,示例如下:
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
這個是在每一幀渲染完成后的回調,只有在該節點構建(build)完成后調用一次。
didChangeDependencies:父級結構中的層級變化
調用次數:多次
- 初始化時,在initState()之后立刻調用
- 當依賴的InheritedWidget rebuild,會觸發此接口被調用
- 實測在組件可見狀態變化的時候會調用
build:組件渲染
調用次數:多次
- 初始化之后開始繪制界面
- setState觸發的時候會
didUpdateWidget:組件更新
調用次數:多次
組件狀態改變時候調用
2.3、銷毀階段
deactivate:節點移除
當State對象從樹中被移除時,會調用此回調,會在dispose之前調用。
頁面銷毀的時候會依次執行:deactivate > dispose
dispose:節點銷毀
調用次數:1次
在deactivate()之后調用,當State對象從樹中被永久移除時調用;通常在此回調中釋放資源。
在這個生命周期里需要取消訂閱(unsubscribe) streams和回收動畫(dispose animations)等等,避免內存泄漏。
reassemble
調用次數:多次
在熱重載(hot reload)時會被調用,此回調在Release模式下永遠不會被調用。
原因是
開發階段: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: // 處于這種狀態的應用程序應該假設它們可能在任何時候暫停。
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
處在并不活動狀態,無法處理用戶響應,同安卓的onPause
paused
不可見并不能響應用戶的輸入,但是在后臺繼續活動中,同安卓的onStop
App常見生命周期切換
初次打開widget時,不執行AppLifecycleState的回調;
按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
從后臺到前臺:AppLifecycleState inactive—>ApplifecycleState resumed
back鍵退出應用: AppLifecycleState inactive—>AppLifecycleState paused
原文鏈接:https://blog.csdn.net/liuxingyuzaixian/article/details/128479426
相關推薦
- 2022-08-19 Android實現九宮格抽獎_Android
- 2022-05-11 如何在 CSS 中設置組件在瀏覽器屏幕水平垂直居中
- 2022-11-30 Linux實現徹底清理空文件夾的方法詳解_linux shell
- 2022-08-04 Python并發編程之IO模型_python
- 2022-11-19 Golang接口使用教程詳解_Golang
- 2022-03-28 用python實現超強的加密軟件_python
- 2022-07-26 react如何添加less環境配置_React
- 2022-10-07 android?studio廣播機制使用詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支