日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Flutter生命周期超詳細講解_Android

作者:流星雨在線 ? 更新時間: 2023-03-23 編程語言

一、組件生命周期

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

欄目分類
最近更新