Flutter App 生命周期观察监听

前言

本文主要讲解两种 Flutter生命周期观察监听

方式一:Flutter SDK 3.13 之前的方式,WidgetsBindingObserver

方式二:Flutter SDK 3.13 开始的新方式,AppLifecycleListener

测试平台:IOS 17.3、Android 13

App状态

官方API:AppLifecycleState enum - dart:ui library - Dart API

enum AppLifecycleState {

  // 应用程序在初始化之前默认处于此状态
  // 视图还没有显示在屏幕上,或者 视图从屏幕上分离后
  detached, 


  // 可见,并且可以响应用户操作
  resumed,


  // 可见,但无法响应用户操作
  inactive, 


  // 隐藏,不可见,应用程序可以在后台运行
  hidden, 


  // 暂停,不可见,并且无法响应用户操作
  paused, 

}

方式一

WidgetsBindingObserver,Flutter SDK 3.13 之前的方式;

import 'package:flutter/material.dart';

class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> with WidgetsBindingObserver {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(),
    );
  }

  @override
  void initState() {
    WidgetsBinding.instance.addObserver(this);
    super.initState();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  /// 状态监听
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    debugPrint('state:$state');
  }
}

方式二

AppLifecycleListener,Flutter SDK 3.13 开始的新方式;

官方文档:AppLifecycleListener class - widgets library - Dart API

其中有几个回调方法,不是所有平台都支持,我测试了 IOSAndroid,其中:

如果想 不通过观察方法,直接拿到App状态,使用 SchedulerBinding.instance.lifecycleState 获取到状态值;

代码:

import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';

class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  late final AppLifecycleListener appLifecycleListener;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(),
    );
  }

  @override
  void initState() {
    
    var lifecycleState = SchedulerBinding.instance.lifecycleState;
    debugPrint('lifecycleState:$lifecycleState'); // lifecycleState:AppLifecycleState.resumed
    
    appLifecycleListener = AppLifecycleListener(
      onStateChange: onStateChange,
      onResume: onResume,
      onInactive: onInactive,
      onHide: onHide,
      onShow: onShow,
      onPause: onPause,
      onRestart: onRestart,
      onDetach: onDetach,
      onExitRequested: onExitRequested,
    );
    super.initState();
  }

  /// 监听状态
  onStateChange(AppLifecycleState state) {
    debugPrint('app_state:$state');
  }

  // =============================== 根据App状态的产生的各种回调 ===============================

  /// 可见,并且可以响应用户操作时的回调
  onResume() {
    debugPrint('---onResume');
  }

  /// 可见,但无法响应用户操作时的回调
  onInactive() {
    debugPrint('---onInactive');
  }

  /// 隐藏时的回调
  onHide() {
    debugPrint('---onHide');
  }

  /// 显示时的回调。
  onShow() {
    debugPrint('---onShow');
  }

  /// 暂停时的回调
  onPause() {
    debugPrint('---onPause');
  }

  /// 暂停后恢复时的回调
  onRestart() {
    debugPrint('---onRestart');
  }

  /// 这两个回调,不是所有平台都支持,

  /// 当退出 并将所有视图与引擎分离时的回调(IOS 支持,Android 不支持)
  onDetach() {
    debugPrint('---onDetach');
  }

  /// 在退出程序时,发出询问的回调(IOS、Android 都不支持)
  /// 响应 [AppExitResponse.exit] 将继续终止,响应 [AppExitResponse.cancel] 将取消终止。
  Future<AppExitResponse> onExitRequested() async {
    debugPrint('---onExitRequested');
    return AppExitResponse.exit;
  }

  @override
  void dispose() {
    appLifecycleListener.dispose();
    super.dispose();
  }
  
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值