当前位置: 首页 > news >正文

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});@overrideState<Home> createState() => _HomeState();
}class _HomeState extends State<Home> with WidgetsBindingObserver {@overrideWidget build(BuildContext context) {return Scaffold(body: Container(),);}@overridevoid initState() {WidgetsBinding.instance.addObserver(this);super.initState();}@overridevoid dispose() {WidgetsBinding.instance.removeObserver(this);super.dispose();}/// 状态监听@overridevoid 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});@overrideState<Home> createState() => _HomeState();
}class _HomeState extends State<Home> {late final AppLifecycleListener appLifecycleListener;@overrideWidget build(BuildContext context) {return Scaffold(body: Container(),);}@overridevoid initState() {var lifecycleState = SchedulerBinding.instance.lifecycleState;debugPrint('lifecycleState:$lifecycleState'); // lifecycleState:AppLifecycleState.resumedappLifecycleListener = 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;}@overridevoid dispose() {appLifecycleListener.dispose();super.dispose();}}

相关文章:

  • 爬虫(一)
  • SpringBoot项目配置SSL后,WebSocket连接失败的解决方案
  • FIR数字滤波器设计
  • 03 Redis之命令(基本命令+Key命令+String型Value命令与应用场景)
  • STM32+ESP8266 实现物联网设备节点
  • 使用IntelliJ IDEA快速搭建springboot 基础模板项目
  • 代码随想录算法刷题训练营day17
  • Windows11 鼠标拖动文件到CMD控制终端窗口无效,无法显示具体文件路径
  • python sqlite3 线程池封装
  • 【服务器】安装宝塔面板
  • 使用 Optional 优雅处理可能为null的值
  • LeetCode:376.摆动序列
  • 【VSAN数据恢复】VSAN数据重构迁移失败的数据恢复案例
  • 带延迟的随机逼近方案(Stochastic approximation schemes):在网络和机器学习中的应用
  • 各品牌主板快速启动热键对照表及CMOS进入方法
  • Electron入门介绍
  • Java多线程(4):使用线程池执行定时任务
  • jdbc就是这么简单
  • JS实现简单的MVC模式开发小游戏
  • js中forEach回调同异步问题
  • ng6--错误信息小结(持续更新)
  • QQ浏览器x5内核的兼容性问题
  • Terraform入门 - 3. 变更基础设施
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 基于web的全景—— Pannellum小试
  • 离散点最小(凸)包围边界查找
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 前端攻城师
  • 巧用 TypeScript (一)
  • 应用生命周期终极 DevOps 工具包
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • #、%和$符号在OGNL表达式中经常出现
  • (13):Silverlight 2 数据与通信之WebRequest
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)RocketMQ初步认识
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .bat批处理出现中文乱码的情况
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net Stream篇(六)
  • .Net 高效开发之不可错过的实用工具
  • .net 设置默认首页
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .Net各种迷惑命名解释
  • .NET构架之我见
  • .net连接MySQL的方法
  • :中兴通讯为何成功
  • [1]-基于图搜索的路径规划基础
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android]使用Retrofit进行网络请求