亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Flutter監(jiān)聽(tīng)當(dāng)前頁(yè)面可見(jiàn)與隱藏狀態(tài)的代碼詳解

 更新時(shí)間:2025年03月07日 08:27:35   作者:卡爾特斯  
文章介紹了如何在Flutter中使用路由觀察者來(lái)監(jiān)聽(tīng)?wèi)?yīng)用進(jìn)入前臺(tái)或后臺(tái)狀態(tài)以及頁(yè)面的顯示和隱藏,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
  • flutter 可以監(jiān)聽(tīng) app 進(jìn)入前臺(tái)還是后臺(tái)狀態(tài),也可以監(jiān)聽(tīng)當(dāng)前某個(gè)頁(yè)面 當(dāng)前正在顯示 還是 隱藏了。

  • 找一個(gè)公共文件初始化一下 路由觀察者,例如:

    • public.dart,只要能做成全局對(duì)象就行。

/// 路由觀察者
final routeObserver = RouteObserver<PageRoute>();

有了 路由觀察者 對(duì)象后,注冊(cè)為導(dǎo)航監(jiān)聽(tīng)者:

  • main.dart

/// MaterialApp
Widget buildMaterialApp(BuildContext context) {
  // 這里直接在 MaterialApp 對(duì)象進(jìn)行全局注冊(cè),其他模式也有,例如 CupertinoApp、WidgetsAp、Navigator
  return GetMaterialApp(
      title: 'Flutter Demo',
      // 注冊(cè)
      navigatorObservers: [routeObserver],
    );
    ...
    ...
    ...
  }
}

頁(yè)面使用,推薦封裝作為底層 BaseStateful 使用,其他頁(yè)面繼承,可以隨時(shí)打開(kāi),也可以單個(gè)頁(yè)面使用:

import 'package:flutter/material.dart';
import 'package:base_project/utils/public.dart';

@immutable
class BaseStatefulController extends StatefulWidget {

  const BaseStatefulController({super.key});

  @override
  State<BaseStatefulController> createState() => BaseStatefulControllerState();
}

class BaseStatefulControllerState extends State<BaseStatefulController> with RouteAware {

  /// 啟用路由觀察者
  bool enableRouteObserver = false;

  @override
  void initState() {
    super.initState();
    // 等待加載
    WidgetsBinding.instance.addPostFrameCallback((_) {
      // 初始化上下文完成
      initStateContext();
    });
  }

  /// 初始化上下文完成,可以在這里做一些需要上下文的初始化操作
  void initStateContext () {
    // 注冊(cè)路由監(jiān)聽(tīng)
    if (enableRouteObserver) {
      final route = ModalRoute.of(context);
      if (route is PageRoute) {
        routeObserver.subscribe(this, route);
      }
    }
  }

  @override
  void dispose() {
    // 取消路由監(jiān)聽(tīng)
    routeObserver.unsubscribe(this);
    super.dispose();
  }

  @override
  void didPush() {
    print("頁(yè)面被 push 到棧頂,頁(yè)面可見(jiàn)");
  }
  @override
  void didPop() {
    print("頁(yè)面被 pop,頁(yè)面銷毀");
  }
  @override
  void didPushNext() {
    print("有新頁(yè)面 push 進(jìn)來(lái),當(dāng)前頁(yè)面進(jìn)入不可見(jiàn)狀態(tài)");
  }
  @override
  void didPopNext() {
    print("上一個(gè)頁(yè)面被 pop,當(dāng)前頁(yè)面重新可見(jiàn)");
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}
方法作用
subscribe(routeAware, route)訂閱某個(gè)頁(yè)面,監(jiān)聽(tīng)生命周期變化
unsubscribe(routeAware)取消訂閱,避免內(nèi)存泄漏
didPush()頁(yè)面進(jìn)入可見(jiàn)
didPop()頁(yè)面銷毀
didPushNext()當(dāng)前頁(yè)面被覆蓋,不可見(jiàn)
didPopNext()上一個(gè)頁(yè)面被 pop,當(dāng)前頁(yè)面重新可見(jiàn)

以上就是Flutter監(jiān)聽(tīng)當(dāng)前頁(yè)面可見(jiàn)與隱藏狀態(tài)的代碼詳解的詳細(xì)內(nèi)容,更多關(guān)于Flutter監(jiān)聽(tīng)當(dāng)前頁(yè)面的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論