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

學無先后,達者為師

網站首頁 編程語言 正文

Flutter組件生命周期和App生命周期示例解析_Android

作者:顧安 ? 更新時間: 2023-01-02 編程語言

引言

在Flutter開發中,所有的組件和頁面都繼承自Widget,所以探索頁面的生命周期其實就是Widget的生命周期。 在 Flutter 中一切皆 組件,而組件又分為 StatefulWidget(有狀態) 和 StatelessWidget(無狀態)組件

無狀態組件(StatelessWidget)

無狀態組件,可以理解為將外部傳入的數據轉化為界面展示的內容,只會渲染一次。

有狀態組件(StatefulWidget)

有狀態組件,是定義交互邏輯和業務數據,可以理解為具有動態可交互的內容界面,會根據數據的變化進行多次渲染。

StatefulWidget生命周期詳細分析

1. createState

當StatefulWidget被創建時立即執行createState。createState 函數執行完畢后表示當前組件已經在 Widget 樹中,此時有一個非常重要的屬性mounted設置為true。

2. initState

該函數為 State 初始化調用,只會被調用一次。因此,通常會在該回調中做一些一次性的操作,如執行 State 各變量的初始賦值,獲取服務端數據等。

3. didChangeDependencies

該函數是在該組件依賴的 State 發生變化時會被調用。didChangeDependencies 方法調用后,組件的狀態變為 dirty,立即調用 build 方法。

4. build

主要是在方法中創建各種組件,繪制到屏幕上,由于 build 會被調用多次,因此在該函數中只能做返回 Widget 相關邏輯,避免因為執行多次而導致狀態異常。因此此方法可以在每一幀中調用,此方法中應該只包含構建組件的代碼,不應該包含其他額外的功能,尤其是耗時任務。

5. didUpdateWidget

該函數主要是在組件重新構建,比如說熱重載,父組件發生 build 的情況下,子組件該方法才會被調用,其次該方法調用之后一定會再調用本組件中的 build 方法。此方法中通常會用當前組件與前組件進行對比。Framework 調用完此方法后,會將組件設置為 dirty 狀態,然后調用 build 方法,因此無需在此方法中調用 setState 方法。

6. deactivate

在組件被移除節點后會被調用,在某些情況下,框架將重新插入 State 對象到樹的其他位置(例如,如果包含該樹的子樹 State 對象從樹中的一個位置移植到另一位置),框架將會調用 build 方法來提供 State 對象適應其在樹中的新位置。

7. dispose

永久移除組件,并釋放組件資源。調用完 dispose后,mounted 屬性被設置為 false,也代表組件生命周期的結束,此時再調用 setState 方法將會拋出異常。

8. reassemble

主要在開發階段使用,在 debug 模式下,每次熱重載都會調用該函數,因此在 debug 階段可以在此期間增加一些 debug 代碼,來檢查代碼問題。

App生命周期

App的生命周期的監聽,在Flutter中需要通過監聽器WidgetsBindingObserver監聽器中的AppLifecycleState方法來是實現。

class AppLifePage extends StatefulWidget {
  CEAppLifePage({Key key}) : super(key: key);
  @override
  _AppLifePageState createState() => _AppLifePageState();
}
//  實現WidgetsBindingObserver觀察者
class _AppLifePageState extends State<AppLifePage> with WidgetsBindingObserver{
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this); //添加觀察者
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("App生命周期"),),
      body: Text('Flutter App 生命周期'),
    );
  }
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    print("didChangeAppLifecycleState: $state");
    switch (state) {
        case AppLifecycleState.resumed:
          print('應用程序可見且響應用戶輸入。');
          break;
        case AppLifecycleState.paused:
          print('應用程序不可見且無法響應用戶輸入,運行在后臺。');
          break;
        case AppLifecycleState.inactive: 
          print('應用程序處于非激活狀態,無法響應用戶輸入。'); 
          break;
        case AppLifecycleState.detached: 
          print('應用程序仍寄存在Flutter引擎上,但與平臺 View 分離。'); 
          break;
      }
  }
  //  當前系統改變了一些訪問性活動的回調
  @override
  void didChangeAccessibilityFeatures() {
    super.didChangeAccessibilityFeatures();
    print("didChangeAccessibilityFeatures");
  }
  //  低內存回調
  @override
  void didHaveMemoryPressure() {
    super.didHaveMemoryPressure();
    print("didHaveMemoryPressure");
  }
  //  用戶本地設置變化時調用,如系統語言改變
  @override
  void didChangeLocales(List<Locale> locale) {
    super.didChangeLocales(locale);
    print("didChangeLocales");
  }
  //  應用尺寸改變時回調,例如旋轉
  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
    Size size = WidgetsBinding.instance.window.physicalSize;
    print("didChangeMetrics  :寬:${size.width} 高:${size.height}");
  }
  //  系統切換主題時回調
  @override
  void didChangePlatformBrightness() {
    super.didChangePlatformBrightness();
    print("didChangePlatformBrightness");
  }
  //  文字系數變化
  @override
  void didChangeTextScaleFactor() {
    super.didChangeTextScaleFactor();
    print(
        "didChangeTextScaleFactor  :${WidgetsBinding.instance.window.textScaleFactor}");
  }
  @override
  void dispose() {
    super.dispose();
    WidgetsBinding.instance.removeObserver(this); //  銷毀觀察者
  }
}

重點是重寫 didChangeAppLifecycleState 方法,AppLifecycleState 中的狀態包括:resumed、inactive、paused、detached。

resumed:應用程序可見且響應用戶輸入。

inactive:應用程序處于非激活狀態,無法響應用戶輸入。在iOS上,打電話、響應TouchID請求、進入應用程序切換器或控制中心都處于此狀態。在Android上,分屏應用,打電話,彈出系統對話框或其他窗口等。

pause:應用程序不可見且無法響應用戶輸入,運行在后臺。處于此狀態時,引擎將不會調用 Window.onBeginFrame 和 Window.onDrawFrame。

detached:應用程序仍寄存在Flutter引擎上,但與平臺 View 分離。處于此狀態的時機:引擎首次加載到附加 到一個平臺 View的過程中,或者由于執行 Navigator pop ,view 被銷毀。

結束語

原文鏈接:https://juejin.cn/post/7168709152808648735

欄目分類
最近更新