flutter 生命周期

2023-11-06

生命周期似乎已经成为前端框架的标配了,然后在flutter中依然有生命周期这个概念。

flutter是一个组件加载到卸载的整个周期,不同的生命周期内可以做的事情都是不一样,相信使用过react,vue的小伙伴应该都清楚,在更新组件的时候在相应生命周期相业务逻辑、初始化页面的时候做一些数据处理等等。

 

废话不多说,先上flutter的生命周期图:

 

flutter生命周期.png

 

初始化时会依次执行:构造函数 > initState > didChangeDependencies > Widget build

当组件state值改变时,依次执行 didUpdateWidget > Widget build

 

initState() {} 初始化state值,在实例化的时候,就会执行只方法函数,只会触发1次。

 

didUpdateWidget(oldWidget) {}当组件状态改变时触发,它会返回一个旧的widget组件

didChangeDependencies() {} 会紧跟在initState之后调用,当依赖的InheritedWidget更新state值时,会触发此生命周期

更新分为两种更新:

一种是组件本身或者其父组件调用setState触发的更新,这种更新走的生命周期是:didUpdateWidget->build。

这没什么说的,我们可以在didUpdateWidget重新绑定一些组件的监听或者重置状态。

另一种是依赖的InheritedWidget发生变化的时候,会触发didChangedDependencies。

 

Widget build(BuildContext context) {} 渲染页面组件,调用次数:多次

 

deactivate() {}方法标志组件为无效状态,在组件被卸载移除之前触发(当前组件还可渲染读取),都是在dispose生命周期前执行的。

dispose() {} 组件被卸载后触发,用于监听组件卸载后去处理清理等操作,调用次数1reassemble() {}此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用

didChangeAppLifecycleState(AppLifecycleState state) {}获取App的生命周期,此生命周期内可以获取用户不同状态的生命周期,此方法必须继承

WidgetsBindingObserver接口后才可以使用
AppLifecycleState.resumed可见并能响应用户的输入

AppLifecycleState.inactive处在并不活动状态,无法处理用户响应

AppLifecycleState.paused不可见并不能响应用户的输入,但是在后台继续活动中

 

代码打印这些方法在何时执行(测试生命周期)
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  _MyHomePageState() {
    print('构造函数');
  }

  @override
  void initState() {
    // 初始化state值,在实例化的时候
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    print('initState');
  }

  @override
  void didChangeDependencies() {
    // 当依赖的InheritedWidget 更新state值时,会触发此生命周期
    super.didChangeDependencies();
    print('didChangeDependencies');
  }

  // 如果想要知道App的生命周期,那么需要通过WidgetsBindingObserver的didChangeAppLifecycleState 来获取
  // 通过此生命周期获取APP中的一些其它生命周期
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print(state.toString());
    /* 
      resumed   可见并能响应用户的输入
      inactive  处在并不活动状态,无法处理用户响应
      paused    不可见并不能响应用户的输入,但是在后台继续活动中
     */
    if (state == AppLifecycleState.resumed) {
      print('可见并能响应用户的输入');
    }
  }

  @override
  void didUpdateWidget(oldWidget) {
    // 当组件状态改变时触发
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  }

  @override
  void reassemble() {
    // 在热重载(hot reload)时会被调用
    super.reassemble();
    print('reassemble');
  }

  @override
  void deactivate() {
    // 在组件被卸载之前触发(当前组件还可渲染读取)
    super.deactivate();
    print('deactivate');
  }

  @override
  void dispose() {
    // 组件被卸载时触发
    super.dispose();
    WidgetsBinding.instance.addObserver(this);
    print('dispose');
  }

  @override
  Widget build(BuildContext context) {
    print('build');
    // TODO: implement build
    return MaterialApp(
      home: Center(
          child: GestureDetector(
        child: new Text('lifeCycle'),
        onTap: () {
          Navigator.of(context)
              .push(new MaterialPageRoute(builder: (BuildContext c) {
            return new Text('sdfs');
          }));
        },
      )),
    );
  }

}

import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);
  @override
  _MyHomePageState createState() => _MyHomePageState();
}
 
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  _MyHomePageState() {
    print('构造函数');
  }
 
  @override
  void initState() {
    // 初始化state值,在实例化的时候
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    print('initState');
  }
 
  @override
  void didChangeDependencies() {
    // 当依赖的InheritedWidget 更新state值时,会触发此生命周期
    super.didChangeDependencies();
    print('didChangeDependencies');
  }
 
  // 如果想要知道App的生命周期,那么需要通过WidgetsBindingObserver的didChangeAppLifecycleState 来获取
  // 通过此生命周期获取APP中的一些其它生命周期
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print(state.toString());
    /* 
      resumed   可见并能响应用户的输入
      inactive  处在并不活动状态,无法处理用户响应
      paused    不可见并不能响应用户的输入,但是在后台继续活动中
     */
    if (state == AppLifecycleState.resumed) {
      print('可见并能响应用户的输入');
    }
  }
 
  @override
  void didUpdateWidget(oldWidget) {
    // 当组件状态改变时触发
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  }
 
  @override
  void reassemble() {
    // 在热重载(hot reload)时会被调用
    super.reassemble();
    print('reassemble');
  }
 
  @override
  void deactivate() {
    // 在组件被卸载之前触发(当前组件还可渲染读取)
    super.deactivate();
    print('deactivate');
  }
 
  @override
  void dispose() {
    // 组件被卸载时触发
    super.dispose();
    WidgetsBinding.instance.addObserver(this);
    print('dispose');
  }
 
  @override
  Widget build(BuildContext context) {
    print('build');
    // TODO: implement build
    return MaterialApp(
      home: Center(
          child: GestureDetector(
        child: new Text('lifeCycle'),
        onTap: () {
          Navigator.of(context)
              .push(new MaterialPageRoute(builder: (BuildContext c) {
            return new Text('sdfs');
          }));
        },
      )),
    );
  }
 
}
以上代码自己在模拟器上运行打印出相应生命周期

 

以下总结运行输出打印结果:

1、创建一个wedget到显示 打印输出依次如下,initState》》didChangeDependencies》》build

2、退出页面依次输出:deactivate》》dispose

3、点击热重载按钮,依次输出:reassemble》》didUpdateWidget》》build

4、app由显示切换到后台(home状态),依次输出:AppLifecycleState.inactive》》AppLifecycleState.paused

5、app由后台切回前台,依次输出: AppLifecycleState.inactive》》AppLifecycleState.resumed

App切换后台状态
在app切换后台,以及切换回当前页面时也有相应监听生命周期,不过这是需要继承WidgetsBindingObserver 才能获取到的,具体如下:

// ...省略
class _MyListState extends State<MyList> with WidgetsBindingObserver {
    @override
    void initState() {
    super.initState();
      WidgetsBinding.instance.addObserver(this); // 监听
    }

    // 通过此生命周期获取APP中的一些其它生命周期
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
      print(state.toString());
      switch (state) {
        case AppLifecycleState.inactive: 
    // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
          break;
        case AppLifecycleState.resumed: // 应用程序可见,前台
          break;
        case AppLifecycleState.paused: // 应用程序不可见,后台
          break;
        case AppLifecycleState.detached: // 申请将暂时暂停
          break;
        default:
          break;
      }
    }
}

// ...省略
class _MyListState extends State<MyList> with WidgetsBindingObserver {
    @override
    void initState() {
    super.initState();
      WidgetsBinding.instance.addObserver(this); // 监听
    }
 
    // 通过此生命周期获取APP中的一些其它生命周期
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
      print(state.toString());
      switch (state) {
        case AppLifecycleState.inactive: 
    // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
          break;
        case AppLifecycleState.resumed: // 应用程序可见,前台
          break;
        case AppLifecycleState.paused: // 应用程序不可见,后台
          break;
        case AppLifecycleState.detached: // 申请将暂时暂停
          break;
        default:
          break;
      }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flutter 生命周期 的相关文章

  • Android:使用 OAuth 访问 google 任务时出现问题

    由于 google 任务没有公共 api 我想编写解决方法并像浏览器一样请求数据 然后解析结果以进一步显示 为了访问数据 我使用 google 实现了 OAuth 身份验证来访问此 url https mail google com htt
  • 在android中通过BLE传输图像

    我使用以下代码传输 1 MB 的图像 如果在每个数据包之间实现线程延迟 则图像将成功传输 如果未设置线程延迟 则所有数据包均从BluetoothGattServer 发送 但BluetoothGattCallback 不会接收所有数据包 任
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • 自定义选择器活动:SecurityException UID n 无权 content:// uri

    我正在构建一个选择器应用程序来替换本机 Android 共享对话框 它工作正常 除非我尝试通过长按图像 gt 共享图像从 Chrome 共享图像 我发现 Google 没有捕获异常 它崩溃了 所以我可以通过 Logcat 查看它 在 Goo
  • Service 和 IntentService,运行从服务器轮询数据库值的服务哪个更好?

    我读过很多关于Service and IntentService 然而 当做出决定时 我没有足够的信心选择使用哪种类型来创建一个后台服务 该服务将在一定时间间隔内从数据库轮询数据 并在获得所需数据时停止它 因为数据代表请求的状态 例如 订购
  • 安卓定位不准确

    我正在尝试获取当前用户的位置 我试图重构我的代码以获得更好的结果 但我只是不断得到关于准确度的荒谬位置 它在 900 600 米之间 如何才能得到更好的结果 使其精度达到50m以内 这是我的代码 package com agam mapsl
  • 使用 ADB 命令获取 IMEI 号码 Android 12

    对于 11 之前的 Android 版本 我使用以下命令从我的设备获取 IMEI 号码 adb shell service call iphonesubinfo 4 cut c 52 66 tr d space or adb shell s
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 如何在手机缓存中保存用户名和密码

    我有一个用户登录应用程序 它需要用户的电子邮件和密码 我想将电子邮件和密码保存在手机缓存中 以便用户不必再次输入 有什么办法可以将数据保存在Android缓存中吗 我认为你需要使用SharedPreference用于在设备中使用应用程序时保
  • 使用 gradlew assembleRelease 从 React Native 创建发布 apk 时出现错误

    我想发布 apk 但我收到错误 文件已存在 mkdir D mobile 它在 d 驱动器中生成名为 mobile 的文件 删除文件后 再次执行 gradlew assembleRelease 创建该文件并抛出错误 任务 app bundl
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • HERE 地图:更改路线已行驶部分的颜色

    导航时可以改变路线的颜色吗 具体来说 我希望路线中已行驶的部分的颜色与即将行驶的部分的颜色不同 现在都是同一个颜色 将 MapRoute 对象的 TravelColor 变量设置为透明对我来说很有效 mapRoute color Resou
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • 获取其他指针的MotionEvent.getRawX/getRawY

    我可以获取其他指针的MotionEvent getRawX getRawY 值吗 MotionEvent getRawX API 参考 http developer android com reference android view Mo
  • 单元测试时 Android Studio 2.0 中测试状态终止且没有任何失败消息

    Issue 我昨天在 Ubuntu 上从 1 5 升级到了 Android Studio 2 0 当我在 Android Studio 2 0 中进行单元测试时 即使所有测试都已通过 它也会显示 终止测试 状态 有时它只显示部分测试通过 我
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组

随机推荐

  • AI虚拟点读机--详细注释解析恩培作品7

    感谢恩培大佬对项目进行了完整的实现 并将代码进行开源 供大家交流学习 一 项目简介 本项目最终达到的效果为手势控制虚拟点读机 如下所示 项目用python实现 调用opencv等库 使用SVM对字体进行分类 由以下步骤组成 1 使用Open
  • cd命令、pwd命令和环境变量PWD、OLDPWD的关联

    1 cd命令 cd命令这里不多介绍 cd 命令是返回上次所在的目录 2 PWD和OLDPWD环境变量 dai ubuntu env PWD home dai OLDPWD dai ubuntu 3 关联 1 当你输入 cd 命令返回上次的目
  • R语言之匹配篇

    2019独角兽企业重金招聘Python工程师标准 gt gt gt match match函数的声明如下 match x table nomatch NA integer incomparables NULL x 向量 要匹配的值 tabl
  • 深入MTK平台bootloader启动之【 Pre-loader -> Lk】分析笔记

    1 bootloader到kernel启动总逻辑流程图 ARM架构中 EL0 EL1是必须实现 EL2 EL3是选配 ELx跟层级对应关系 EL0 app EL1 Linux kernel lk EL2 hypervisor 虚拟化 EL3
  • Codeforces Round #589 (Div. 2)【数学 + 构造】

    A题 Distinct Digits 因为数的大小最长也就是5位 所以直接暴力求解即可 复杂度O 5 N include
  • C\C++ standard lib

    link
  • vue.js 解决空格报错!!!

    当我们初入vue js的时候 使用cli脚手架快速创建项目的时候 如果语法格式错误 这里主要指的是 空格多少引起的问题 找到 webpack base config js文件注释掉下面的东西 var path require path va
  • LeetCode 82. 删除排序链表中的重复元素 II

    题目链接 82 删除排序链表中的重复元素 II 设置虚拟头结点dummy不用考虑边界情况 p指针指向的是上一个没有重复的元素的位置 初始位置是dummy q从p gt next开始 一直走到第一个与q gt next不同元素的位置 删除中间
  • 经典目标检测算法—背景差分法、帧差法和三帧差法

    一 实验目的与要求 1 熟悉经典目标检测算法的原理 2 使用MATLAB语言编程实现背景差分法 帧差法和三帧差法 3 比较背景差分法 帧差法和三帧差法的特点 并了解该算法的应用条件 二 实验环境 Windows matlab 三 实验内容和
  • phpspreadsheet excel导入导出

    单个sheet页Excel2003版最大行数是65536行 Excel2007开始的版本最大行数是1048576行 Excel2003的最大列数是256列 2007以上版本是16384列 xlswriter xlswriter PHP 高性
  • Bean的四种注入方式

    1 set方法注入 2 构造器注入 3 静态工厂注入 4 实例工厂注入 我使用下面两个类来进行注入的演示 这两个类分别是User和Car类 Car类 public class Car 只包含基本数据类型的属性 private int spe
  • 内存管理篇 (一):Go语言之逃逸

    本篇做为Go语言内存管理的第一篇文章 会从下面几个方向来讲述逃逸 1 什么是逃逸 2 为什么需要逃逸 3 逃逸是怎么实现的 一 什么是逃逸 在开始讲逃逸之前 我们先看一下 下面的两个例子 例子1 stack go的fun 返回的就是一个in
  • 转载:浅谈批处理获取管理员运行权限的几种方法

    很多用了Win10版本系统的人都会发现 Windows对程序的运行权限是控制得更加严格了 即使你将UAC控制放至最低 如果没有特别赋予外来程序管理员运行权限的话 很多程序都会运行出错 包括很多用于系统维护的批处理程序由于运行权限不够都会导致
  • linux系统查看命令

    系统 uname a 查看内核 操作系统 CPU信息 head n 1 etc issue 查看操作系统版本 cat proc cpuinfo 查看CPU信息 hostname 查看计算机名 lspci tv 列出所有PCI设备 lsusb
  • Java弱引用(WeakReference)的理解与使用

    在Java里 当一个对象被创建时 它被放在内存堆里 当GC运行的时候 如果发现没有任何引用指向该对象 该对象就会被回收以腾出内存空间 或者换句话说 一个对象被回收 必须满足两个条件 1 没有任何引用指向它 2 GC被运行 Java对于简单的
  • Nacos Client2.2.9源码启动问题

    Nacos Client2 2 9源码启动问题 1 开启服务端 源码启动 推荐使用稳定版本作为 服务端 我是用了最新的2 2 1的nacos版本处理了一些问题 现在启动成功 nacos首页 http 192 168 3 111 8848 n
  • 分布式微电网能源交易算法matlab源代码孤岛微电网之间的能源交易问题,提出了一种分布式算法

    分布式微电网能源交易算法matlab源代码 代码按照高水平文章复现 保证正确 孤岛微电网之间的能源交易问题 提出了一种分布式算法 这个问题由几个通过任意拓扑交换能量流的岛屿微网格组成 提出了一种基于次梯度的开销最小化算法 该算法在实际迭代次
  • flutter报错[!] Android toolchain - develop for Android devices (Android SDK version 29.0.3) X Andr

    Flutter官网 问题 出现以下报错 说许可未知 解决方法 1 选择tools gt SDK Manager gt 2 SDK Platforms tab gt Android 9 0 Pie 3 安装 4 选择29 0 3下载重启And
  • 时序预测

    时序预测 MATLAB实现Hamilton滤波AR时间序列预测 目录 时序预测 MATLAB实现Hamilton滤波AR时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍 预测在很大程度上取决于适合周期的模型和所采用的
  • flutter 生命周期

    生命周期似乎已经成为前端框架的标配了 然后在flutter中依然有生命周期这个概念 flutter是一个组件加载到卸载的整个周期 不同的生命周期内可以做的事情都是不一样 相信使用过react vue的小伙伴应该都清楚 在更新组件的时候在相应