State

在说到StatefulWidget之前,先说下State。State的作用有两点:

  1. 在widget构建的时候可以被同步读取;
  2. 在widget的生命周期中可能会被改变。

State生命周期

State的生命周期有四种状态:

  • created:当State对象被创建时候,State.initState方法会被调用;
  • initialized:当State对象被创建,但还没有准备构建时,State.didChangeDependencies在这个时候会被调用;
  • ready:State对象已经准备好了构建,State.dispose没有被调用的时候;
  • defunct:State.dispose被调用后,State对象不能够被构建。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Txxq1QXj-1612666084611)(http://whysodiao.com/images/State LifeCycle.png)]

完整生命周期如下:

  • 创建一个State对象时,会调用StatefulWidget.createState;
  • 和一个BuildContext相关联,可以认为被加载了(mounted);
  • 调用initState;
  • 调用didChangeDependencies;
  • 经过上述步骤,State对象被完全的初始化了,调用build;
  • 如果有需要,会调用didUpdateWidget;
  • 如果处在开发模式,热加载会调用reassemble;
  • 如果它的子树(subtree)包含需要被移除的State对象,会调用deactivate;
  • 调用dispose,State对象以后都不会被构建;
  • 当调用了dispose,State对象处于未加载(unmounted),已经被dispose的State对象没有办法被重新加载(remount)。

setState

State中比较重要的一个方法是setState,当修改状态时,widget会被更新。比方说点击CheckBox,会出现选中和非选中状态之间的切换,就是通过修改状态来达到的。

查看setState源码,在一些异常的情况下将会抛出异常:

  • 传入的为null;
  • 处在defunct阶段;
  • created阶段还没有被加载(mounted);
  • 参数返回一个Future对象。

检查完一系列异常后,最后调用代码如下:

_element.markNeedsBuild();

markNeedsBuild内部,则是通过标记element为dirty,在下一帧的时候重建(rebuild)。可以看出setState并不是立即生效,它只是将widget进行了标记,真正的rebuild操作,则是等到下一帧的时候才会去进行。

StatefulWidget和StatelessWidget

StatefulWidget和StatelessWidget如下所示

一个StatelessWidget可以用多个不同的BuildContext构建,而一个StatefulWidget会为每个BuildContext创建一个State对象。

StatelessWidget

对于StatelessWidget,build方法会在如下三种情况下调用,

  1. widget第一次被插入到树中;
  2. widget的父节点更改了配置(configuration);
  3. widget依赖的InheritedWidget改变了。
class GreenFrog extends StatelessWidget {const GreenFrog({ Key key }) : super(key: key);@overrideWidget build(BuildContext context) {return new Container(color: const Color(0xFF2DBD3A));}
}

StatefulWidget

StatefulWidget的两个主要类别:

  1. 在initState中创建资源,在dispose中销毁,但是不依赖于InheritedWidget或者调用setState方法,这类widget基本上用在一个应用或者页面的root;
  2. 使用setState或者依赖于InheritedWidget,这种在营业生命周期中会被重建(rebuild)很多次。
class YellowBird extends StatefulWidget {const YellowBird({ Key key }) : super(key: key);@override_YellowBirdState createState() => new _YellowBirdState();
}class _YellowBirdState extends State<YellowBird> {@overrideWidget build(BuildContext context) {return new Container(color: const Color(0xFFFFE306));}
}

ld(BuildContext context) {
return new Container(color: const Color(0xFFFFE306));
}
}


flutter中state详解相关推荐

  1. Flutter 中TextField详解

    在Flutter中TextField是一个文本输入组件 它可以直接使用 class MyApp1 extends StatefulWidget {const MyApp1({Key? key}) : ...

  2. netstat 中state详解

    TCP三次握手的过程如下: 主动连接端发送一个SYN包给被动连接端: 被动连接端收到SYN包后,发送一个带ACK和SYN标志的包给主动连接端: 主动连接端发送一个带ACK标志的包给被动连接端,握手动作 ...

  3. flutter 生命周期详解

    flutter 生命周期详解 简介 一.widget 生命周期 二.APP 生命周期 总结 简介 众所周知,程序是有生命周期的,那么flutter 的生命周期是什么呢? flutter 的生命周期大体 ...

  4. 导出jar插件_Fluttify输出的Flutter插件工程详解

    系列文章: yohom:Fluttify输出的Flutter插件工程详解​zhuanlan.zhihu.com yohom:开发Flutter插件必备原生SDK->Dart接口生成引擎`Flut ...

  5. android中getSystemService详解

    原文地址:android中getSystemService详解作者:邹斌 http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blo ...

  6. [Trident] Storm Trident 教程,state详解、trident api详解及实例

    英文原址:https://github.com/nathanmarz/storm/wiki/Trident-tutorial ---------------- Trident是在storm基础上,一个 ...

  7. 函数中{}输出格式详解(C#)

    Console.WriteLine()函数中{}输出格式详解(C#) Console.WriteLine()函数的格式一直没怎么注意.今天同事问起Console.WriteLine({0:D3},a) ...

  8. Java中CAS详解

    转载自  Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...

  9. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

    转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...

最新文章

  1. 基于U-Net图像分割的划痕缺陷分割(课程设计)
  2. TX2---ORB_SLAM2
  3. elasticsearch7.x源码编译
  4. python 基础 - 开发环境搭建
  5. Selenium API-WebDriver 属性
  6. 为什么李彦宏会候选院士?
  7. android http封装类,HTTP封装类 工具类 For Android
  8. 水往地处流,人往地处走
  9. Excel分段线性插值函数实现
  10. 各种数据类型的取值范围
  11. 【Unity Shader】渲染纹理实现镜子效果
  12. elasticsearch-8.0.0报错总结(ES)-持续更新
  13. 选择时间检定仪应该注意这11点
  14. [BZOJ3653][长链剖分]谈笑风生
  15. 记kafka partition数据量过大导致不能正确重启
  16. Unity Shader-热空气扭曲效果(多种实现方案,包括移动平台)
  17. 微信 聊天服务器失败是怎么回事,微信语音转换文字失败是怎么回事 原因是什么...
  18. 如何实现微信公众号加人数量实时统计?
  19. 云计算存储之什么是Ceph?听听Ceph创始人怎么说
  20. word文档怎么翻译成中文?不妨试试这几个方法

热门文章

  1. oracle10g 04030,一次ORA-04030问题的诊断(一)
  2. linux内核 extern,Linux内核之_attribute_
  3. 解决高并发的问题python_python ---解决高并发超卖问题
  4. sscanf fscanf函数格式化输入遇到\n问题
  5. windbg调试cpu占用率高的进程
  6. 鼠标键盘唤醒计算机,除了按下电源按钮唤醒计算机,WIN10也可以使用鼠标或键盘来唤醒...
  7. jstl java_JSTL-Java-Baby-51CTO博客
  8. 十月 android版本分布,安兔兔发布2018年10月份Android手机性能排行榜
  9. 轨迹匹配地图 python_基于地图的视觉定位(一)
  10. 怎么利用迭代器写入mysql_流迭代器实现文件操作(读取和写入)方法详解