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();
  }
  
}

相关推荐

  1. Glide系列-生命周期监听

    2024-01-28 07:06:03       32 阅读
  2. vue 生命周期

    2024-01-28 07:06:03       36 阅读
  3. 生命周期标注

    2024-01-28 07:06:03       36 阅读
  4. Vue的生命周期

    2024-01-28 07:06:03       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-28 07:06:03       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-28 07:06:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-28 07:06:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-28 07:06:03       18 阅读

热门阅读

  1. 用OpenSSL生成哈希密钥

    2024-01-28 07:06:03       34 阅读
  2. MacOS安装Podman替代docker

    2024-01-28 07:06:03       38 阅读
  3. docker数据卷的使用

    2024-01-28 07:06:03       34 阅读
  4. gpt写的go语言入门——通过博客系统 part1

    2024-01-28 07:06:03       33 阅读
  5. 阿里云上传文件

    2024-01-28 07:06:03       34 阅读
  6. 力扣122双周赛

    2024-01-28 07:06:03       30 阅读
  7. 78.Go中的Timer 和 Ticker

    2024-01-28 07:06:03       23 阅读
  8. 阿里云云数据库RDS

    2024-01-28 07:06:03       27 阅读