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

Flutter 生命周期原理

一 这里看一下StatefulWidget的生命周期

其本身是由两个类组成的,StatefulWidget 和 State 组成的。

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

  @override
  State<DemoWidget> createState() => _DemoWidgetState();
}

class _DemoWidgetState extends State<DemoWidget> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

 

首先

会执行StatefulWidget 中相关的方法

* 1 执行StatefulWidget的构造函数(Constructor)来创建StatefuleWidget

* 2 执行StateWidget的createState 方法,来创建一个维护StatefulWidget 的State对象

其次

调用createState 创建State对象时候,执行State类相关的方法

* 1 执行State 类的构造方法(Constructor)来创建State 对象

* 2 执行initState,我们通常会在这个方法中执行一些数据初始化的操作或者也可能发送数据请求

   @override
  void initState() {
    super.initState();
    
  }

* 3 执行didChangeDependencies 方法,这个方法会在两种情况下调用

        * 3.1 调用initState 会调用

        * 3.2 从其他对象依赖一些数据发生改变的时候,会调用

* 4 执行build 方法,来看一下当前的widget 需要渲染哪些Widget,构建对应的widgets

* 5 当前的widget 不再使用的时候,会调用dispose 进行销毁

* 6 手动调用setState方法,会根据最新的状态(数据)   开重新调用build 方法,构建对应的Widgets

* 7 执行didUpdateWidget 方法是当父Widget 触发重建(rebuild)时,系统会调用didUpdateWidget方法

二 唠叨两句 SetState

 /// Marks the element as dirty and adds it to the global list of widgets to
  /// rebuild in the next frame.
  ///
  /// Since it is inefficient to build an element twice in one frame,
  /// applications and widgets should be structured so as to only mark
  /// widgets dirty during event handlers before the frame begins, not during
  /// the build itself.
  void markNeedsBuild() {
    

void scheduleBuildFor(Element element) 
    if (_dirty) {
      owner!.scheduleBuildFor(this);
    }
    if (hadDependencies) {
      didChangeDependencies();
    }
 }


 /// Adds an element to the dirty elements list so that it will be rebuilt
  /// when [WidgetsBinding.drawFrame] calls [buildScope].
  void scheduleBuildFor(Element element) {


}

setState的调用 其实是element 会调用 markNeedsBuild 这个方法,标记当前的element 需要更新。dirty 设置为true.

方法的最后会调用一个BuildOwner类中的

scheduleBuildFor 方法,这个方法注释写的很清楚,就是吧这个element 添加到dirty elements list 中去,当WidgetsBinding.drawFrame 去走更新的流程

when [WidgetsBinding.drawFrame] calls [buildScope].


http://www.kler.cn/a/9318.html

相关文章:

  • ODOO学习笔记(3):Odoo和Django的区别是什么?
  • 【电力系统】永磁同步电机调速系统带有扰动观测器
  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • 用户裂变数据分析
  • 【大数据学习 | HBASE高级】region split机制和策略
  • [CKS] Create/Read/Mount a Secret in K8S
  • Properties
  • ios swift tableView根据数据显示隐藏cell
  • 单机最快的队列Disruptor解析和使用
  • 【Spring】1—Spring简介
  • 创建型模式-原型(Prototype)-解决复制创建对象问题-浅拷贝深拷贝
  • 【JavaWeb】1—JavaWeb概述
  • 【go 定时调度框架】你知道几种go语言定时调度框架?
  • 人工智能中的移动端编程
  • OLAP引擎—ClickHouse常规优化
  • 阿里云版GPT官宣,我们问了它10个问题
  • 网络编程之输入ip地址解析不出来域名
  • dijkstra算法 java 优先队列 路径记录
  • Meetup 回顾|Data Infra 研究社第十期(含资料发布)
  • 改进YOLO系列:将ConvNextV2结合YoloV8、YOLOv7、YOLOv5,(纯卷积|超越Swin)
  • html语义化标签和无语义化标签
  • 腾讯云轻量应用服务器16核32G28M处理器带宽流量性能测评
  • 系统集成项目管理工程师案例分析考点汇总(成本、质量、人力)
  • 「解析」Matplotlib 绘制折线图
  • 在线Plist文件格式转Json文件格式
  • 77-Linux_网络编程