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

class _HomeState extends State 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,其中:

  • onDetach:IOS支持,Android不支持
  • onExitRequested:都不支持,也有可能是我测试手法有问题,我是直接退出App;
  • 官方文档:exitApplication method - ServicesBinding mixin - services library - Dart API

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

Flutter App 生命周期观察监听_第1张图片

代码:

import 'dart:ui';

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

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

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

class _HomeState extends State {
  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 onExitRequested() async {
    debugPrint('---onExitRequested');
    return AppExitResponse.exit;
  }

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

你可能感兴趣的:(Flutter,flutter)