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,其中:

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

如果想 不通过观察方法,直接拿到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();
  }
  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/353875.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《HelloGitHub》第 94 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

宏景-eHR-frcodeaddtreeservlet接口存在SQL注入

指纹特征 FOFA&#xff1a;icon_hash"947874108" || body<div class"hj-hy-all-one-logo" || app"HJSOFT-HCM" 漏洞复现 POST /templates/attestation/../../servlet/FrCodeAddTreeServlet HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windo…

精品基于Uniapp+ssm宠物时光管理系统App

《[含文档PPT源码等]精品基于Uniappssm宠物时光管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&#xff1a…

游戏开发丨基于Pygame的贪吃蛇小游戏

文章目录 写在前面需求分析程序设计程序分析运行结果系列文章写在后面 写在前面 本期内容 基于pygame的贪吃蛇小游戏 所需环境 pythonpycharm或anacondapygame 下载地址 https://download.csdn.net/download/m0_68111267/88789657 需求分析 本游戏使用Pygame模块开发&a…

Go 知识chan

Go 知识chan 1. 基本知识1.1 定义1.2 操作1.3 操作限定1.4 chan 读写 2. 原理2.1 数据结构2.2 环形队列2.3 等待队列2.4 类型消息2.5 读写数据2.6 关闭chan 3. 使用3.1 操作符使用3.2 select3.3 for-range https://a18792721831.github.io/ 1. 基本知识 chan是go里面里面提供…

ssh异常报错:Did not receive identification string from

一、问题描述 某次外出在异地工作场所xshell炼乳远程服务器时&#xff0c;报错&#xff1a;Connection closed by foreign host. D&#xff0c;服务器查看secure日志或sshd服务状态会显示&#xff1a;id not receive identification string from client_ip; 二、分析处理 1&a…

综合案例 - 商品列表

文章目录 需求说明1.my-tag组件封装&#xff08;完成初始化&#xff09;2.may-tag封装&#xff08;控制显示隐藏&#xff09;3.my-tag组件封装&#xff08;v-model处理&#xff1a;信息修改&#xff09;4.my-table组件封装&#xff08;整个表格&#xff09;①数据不能写死&…

修复idea,eclipse ,clion控制台中文乱码

控制台乱码问题主要原因并不在编译器IDE身上&#xff0c;还主要是Windows的控制台默认编码问题。。。 Powershell&#xff0c;cmd等默认编码可能不是UTF-8&#xff0c;无需改动IDE的settings或者properties&#xff08;这治标不治本&#xff09;&#xff0c;直接让Windows系统…

编写nginx脚本,安装失败

这是我写的nginx脚本-&#xff08;正确的&#xff0c;已经修改过的&#xff09; 这是我在运行脚本是出现的问题 这是我在nginx官网上粘贴的内容&#xff0c;请注意我用红笔画的地方&#xff0c;与第一张我写的脚本图片作对比&#xff0c;会发现多出现两个转义符号\。第二幅图就…

Axolotl:一款极简的大模型微调(Finetune)开源框架

今天给大家分享一款工具&#xff0c;Axolotl[1] 是一个旨在简化各种AI模型的微调过程的工具&#xff0c;支持多种配置和架构。 特点&#xff1a; 可训练各种 Huggingface 模型&#xff0c;如 llama、pythia、falcon、mpt支持 fullfinetune、lora、qlora、relora 和 gptq使用简…

Linux GPIO模拟SPI接口介绍

一. 前言 上次通过GPIO模拟IIC的驱动一块0.98英寸的OLED后&#xff0c;想着下次用下GPIO模拟SPI接口试下。本文会介绍怎么用GPIO模拟SPI接口的方式为设备添加一块spi nor flash&#xff0c;flash模块如下图所示&#xff1a; 上图是一个spi nor模块&#xff0c;上面焊接了W25Q32…

acwing周赛140 b题

思路&#xff1a;我们按照从小到大的顺序将数组逆转好&#xff0c;然后枚举数组首项&#xff0c;分别让其1&#xff0c;-1&#xff0c;0&#xff0c;然后求出公差&#xff0c;从前往后遍历即可。 代码&#xff1a; int ans1(){//不动int cha (a[n] - a[1] 1) / (n - 1);int…

原创改进 | 融合蝠鲼觅食与联想学习的量子多目标灰狼优化算法(Matlab)

​前面的文章里作者介绍了多目标灰狼优化算法(Multi-Objective Grey Wolf Optimizer&#xff0c;MOGWO)&#xff0c;该算法是由Mirjalili等(灰狼算法的提出者)于2016年提出[1]&#xff0c;发表在中科院一区期刊《expert systems with applications》。 MOGWO保留了灰狼算法的种…

无际线复选框

效果演示 实现了一个网格布局&#xff0c;其中每个网格是一个复选框&#xff0c;可以选择是否显示。每个复选框都有一个漂浮的天花板&#xff0c;表示它是一个房间的天花板。每个房间的天花板都有一个不同的形状和颜色&#xff0c;分别对应不同的房间。整个页面的背景是一个由两…

小米13utltra激活冰箱

安装adb驱动https://www.jianshu.com/p/6c41d34d9202 直接下载使用 连接上小米手机,退出账号,关闭锁屏密码,打开usb调试,usb调试(安全设置) adb shell dpm set-device-owner com.catchingnow.icebox/.receiver.DPMReceiver如果显示Success&#xff0c;则您已成功激活冰箱。 …

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

PostgreSQL技术大讲堂 - 第43讲:流复制原理

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第43讲&#…

每日OJ题_算法_二分查找⑦_力扣153. 寻找旋转排序数组中的最小值

目录 力扣153. 寻找旋转排序数组中的最小值 解析代码 力扣153. 寻找旋转排序数组中的最小值 153. 寻找旋转排序数组中的最小值 - 力扣&#xff08;LeetCode&#xff09; 难度 中等 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后…

Java NIO初体验

概述 由于BIO&#xff08;同步阻塞IO&#xff09;对系统资源的浪费较大。Java1.4中引⼊了NIO框架&#xff0c;在java.nio包中提供了Channel、Selector、Buffer等抽象类&#xff0c;可以快速构建多路复⽤的IO程序&#xff0c;⽤于提供更接近操作系统底层的⾼性能数据操作⽅式。…

11. 双目视觉之立体视觉基础

目录 1. 深度恢复1.1 单目相机缺少深度信息1.2 如何恢复场景深度&#xff1f;1.3 深度恢复的思路 2. 对极几何约束2.1 直观感受2.2 数学上的描述 1. 深度恢复 1.1 单目相机缺少深度信息 之前学习过相机模型&#xff0c;最经典的就是小孔成像模型。我们知道相机通过小孔成像模…