Flutter 监听当前页面可见与隐藏状态

  • flutter 可以监听 app 进入前台还是后台状态,也可以监听当前某个页面 当前正在显示 还是 隐藏了

  • 找一个公共文件初始化一下 路由观察者,例如:

    • public.dart,只要能做成全局对象就行。

      dart 复制代码
      /// 路由观察者
      final routeObserver = RouteObserver<PageRoute>();
  • 有了 路由观察者 对象后,注册为导航监听者:

    • main.dart
    dart 复制代码
    /// MaterialApp
    Widget buildMaterialApp(BuildContext context) {
      // 这里直接在 MaterialApp 对象进行全局注册,其他模式也有,例如 CupertinoApp、WidgetsAp、Navigator
      return GetMaterialApp(
          title: 'Flutter Demo',
          // 注册
          navigatorObservers: [routeObserver],
        );
        ...
        ...
        ...
      }
    }
  • 页面使用,推荐封装作为底层 BaseStateful 使用,其他页面继承,可以随时打开,也可以单个页面使用:

    dart 复制代码
    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 () {
        // 注册路由监听
        if (enableRouteObserver) {
          final route = ModalRoute.of(context);
          if (route is PageRoute) {
            routeObserver.subscribe(this, route);
          }
        }
      }
    
      @override
      void dispose() {
        // 取消路由监听
        routeObserver.unsubscribe(this);
        super.dispose();
      }
    
      @override
      void didPush() {
        print("页面被 push 到栈顶,页面可见");
      }
      @override
      void didPop() {
        print("页面被 pop,页面销毁");
      }
      @override
      void didPushNext() {
        print("有新页面 push 进来,当前页面进入不可见状态");
      }
      @override
      void didPopNext() {
        print("上一个页面被 pop,当前页面重新可见");
      }
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    方法 作用
    subscribe(routeAware, route) 订阅某个页面,监听生命周期变化
    unsubscribe(routeAware) 取消订阅,避免内存泄漏
    didPush() 页面进入可见
    didPop() 页面销毁
    didPushNext() 当前页面被覆盖,不可见
    didPopNext() 上一个页面被 pop,当前页面重新可见
相关推荐
网络安全许木17 分钟前
自学渗透测试(1~6天工具使用的回温)
android
匆忙拥挤repeat21 分钟前
Android Compose 状态保存的API总结
android
inxx24 分钟前
iOS 26 模拟器启动卡死:Method Swizzling 在系统回调时触发 nil 崩溃
ios
BLUcoding44 分钟前
Android 生命周期详解
android
Swift社区44 分钟前
鸿蒙 vs iOS / Android:谁更适合 AI?
android·ios·harmonyos
冬奇Lab1 小时前
硬件加速与 OMX/Codec2:解密编解码器的底层世界
android·音视频开发·视频编码
雷帝木木1 小时前
Flutter 组件 http_interop 的适配 鸿蒙Harmony 深度进阶 - 驾驭多级拦截器链、实现鸿蒙端标准化通讯审计与流量路由中继方案
flutter·harmonyos·鸿蒙·openharmony·http_interop
2301_822703201 小时前
鸿蒙Flutter第三方库FlutterUnit组件百科适配与具体功能演示
flutter·华为·开源·harmonyos·鸿蒙
亘元有量-流量变现1 小时前
ASO优化全流程实操指南:从基础到迭代,精准提升App曝光与转化
android·ios·harmonyos·aso优化·方糖试玩
李李李勃谦2 小时前
Flutter 框架跨平台鸿蒙开发 - 家政服务预约平台
flutter·华为·harmonyos