文档章节

Flutter之 State 生命周期

過愙
 過愙
发布于 09/15 20:57
字数 829
阅读 582
收藏 2

State 的生命周期,指的是在用户参与的情况下,其关联的 Widget 所经历的,从创建到显示,再到更新最后到停止,直至销毁等各个阶段

不同的阶段涉及到特定的任务处理

State 的生命周期流程如下图所示

file

由图可知:State 的生命周期可以分为三个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除)

创建

State 初始化时会依次执行:构造方法 -> initState -> didChangeDependencies -> build,随后完成页面渲染

  • 构造方法:State 生命周期的起点,Flutter 会通过调用 StatefulWidget.createState() 来创建一个 State。可以通过构造方法,来接收父 Widget 传递的初始化 UI 配置数据,而这些配置数据,决定了 Widget 最初的呈现状态
  • initState:在 State 对象被插入视图树时调用。在 State 的生命周期中只会被调用一次,因此可以在 initState 函数中做一些初始化操作
  • didChangeDependencies:专门用来处理 State 对象依赖关系变化,会在 initState() 调用结束后调用
  • build:构建视图。经过构造方法、initState、didChangeDependencies 后,Framework 认为 State 已经准备就绪,于是便调用 build。在 build 中,需要根据父 Widget 传递过来的初始化配置数据及 State 的当前状态,创建一个 Widget 然后返回
更新

Widget 的状态更新,主要由 setState、didChangeDependencies 和 didUpdateWidget 触发

  • setState:当状态数据发生变化时,可以通过调用 setState 方法告诉 Flutter 使用更新后数据重建 UI
  • didChangeDependencies:State 对象的依赖关系发生变化后,Flutter 会回调该方法,随后触发组件构建。State 对象依赖关系发生变化的典型场景:系统语言 Locale 或应用主题改变时,系统会通知 State 执行 didChangeDependencies 回调方法
  • didUpdateWidget:Widget 的配置发生变化时,或热重载时,系统会回调该方法

一旦这三个方法被调用,Flutter 随后便会销毁旧的 Widget,并调用 build 方法重建 Widget

销毁

组件销毁相对创建和更新而言更简单。比如页面销毁时或是组件被移除时,系统会调用 deactivate 和 dispose 这两个方法,来移除或销毁组件

  • 当组件的可见状态发生变化时,deactivate 方法会被调用,这时 State 会被暂时从视图树中移除。 注意:页面切换时,由于 State 对象在视图树中的位置发生了变化,需要先暂时移除后再重新添加,重新触发组件构建,因此也会调用 deactivate 方法
  • 当 State 被永久地从视图树中移除时,Flutter 会调用 dispose 方法,而一旦 dispose 方法被调用,组件就要被销毁了,因此可以在 dispose 方法中进行最终的资源释放、移除监听、清理环境等工作

file

file

© 著作权归作者所有

過愙
粉丝 2
博文 12
码字总数 13223
作品 0
私信 提问
加载中

评论(1)

-乐天-
-乐天-
https://gitee.com/lele-666/V-IM vue 开发的聊天软件,欢迎点赞!
从零学习Fluter(三):Flutter的路由跳转以及state的生命周期

今天继续研究Flutter,我是在flutter1.0发布后,才玩flutter的,发现在此之前,许多人已经先发制人,玩起了flutter,不知不觉中,我已经被别人摔在了起跑线上,玩过flutter后,想吐槽一下 fl...

topbrids
2018/12/07
0
0
Flutter学习笔记(14)--StatefulWidget简单使用

如需转载,请注明出处:Flutter学习笔记(14)--StatefulWidget简单使用 今天上班没那么忙,突然想起来我好像没StatefulWidget(有状态组件)的demo,闲来无事,写一个简单的学习学习,前面我...

CurtisWgh
08/07
0
0
深入讲解Flutter应用模板源码:计数器示例

用Android Studio和VS Code创建的Flutter应用,源码模板是一个计数器示例,通过讲解分析计数器示例的源码,可以让读者对Flutter应用程序结构有个最基本的了解,在后续的文章中,笔者将会基于...

zane
05/26
0
0
初略讲解基础Widgets之Widget、StatelessWidget和StatefulWidget

Widget 概念 在前面的章节介绍中,我们知道Flutter中几乎所有的对象都是一个Widget(组件),与原生开发中的“控件”不同的是,Flutter中的Widget的概念更广泛,它不仅可以代表UI元素,也可以...

zane
07/11
0
0
Flutter Widget and Bald

Flutter 是什么? 我们先来搬运官网的一段介绍,让大家有一个直观的认识: 简而言之 跨端(移动、Web、桌⾯、嵌⼊式) ⾼性能(Dart) ⾼效开发(热重载) 富有表现⼒的 UI(Widget) 温馨提...

快狗打车前端团队
09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
4
0
溢出\越界\泄漏

溢出:栈溢出是指函数中的局部变量造成的溢出,递归次数太多也会栈溢出 一是分配的大小超过栈的最大值,char a[99999999999999999]; 二是分配的大小没有超过最大值,但是接收的buff比新buff小...

SibylY
昨天
3
0
线性表-链式(c/c++实现)

在写数据的结构就是自己排兵布阵,根据客户的需求可增删功能,顺序与链式编程思想是一样的,两个比较只需要改变实现功能这一块。 线性表(链式)实现的三个步骤: 定义所需的功能(LinkList....

白客C
昨天
4
0
导览Linux系统文件系统类型

虽然对于普通用户来说可能并不明显,但在过去十年左右的时间里,Linux 文件系统已经发生了显著的变化,这使它们能够更好对抗损坏和性能问题。 如今大多数 Linux 系统使用名为 ext4 的文件系统...

老孟的Linux私房菜
昨天
4
0
Eureka重要对象简介

在进行分析EurekaClient和EurekaServer之间通信的源码之前,我们首先需要熟悉一下几个实体类 InstanceInfo 这个类代表着EurekaClient实例,客户端向服务端请求注册时就会携带着这个实例,这个...

Java学习录
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部