重要消息

  • 网易云【玩转大前端】配套课程

  • EDU配套 教程

  • Flutter开发的点滴积累系列文章

  • 一行代代码置灰应用?对就是这么干

本方主要内容为 聊一聊 Widget 、谈一谈 Context 、说一说 State 、 看一看 of(context)方法

1 引言

在 Flutter 应用程序开发中,我们常常会使用使用Widget 、 BuildContext 、State 等等
例如:

当我们的数据更新时,我们需要刷新页面效果时使用用如下方法

    setState(() {});

又比如我们在使用主题颜色引用时像如下这样写

Theme.of(context).primaryColor

2 聊一聊 Widget

Widget 我们可以理解为 Android、ios 中的 View ,前端中的 div , 在 Flutter 程序设计中,则是采用了 dom树的结构方式来组织起来的。

3 谈一谈 Context

Context 是 Flutter 应用程序在通过 Widget 构建 Widgets树时的引用,应用像是 Android 中的 Context ,ios 中的CGContextRef ,我们通常称之为上下文对象。

一个Flutter 程序有 若干个 Widget 组成 Widgets 树形结构 ,而每一个 Widget 都对应一个 Context ,那么有 Widget 树结构,那么也必然有 Context 树形结构了。

4 说一说 State

Flutter 应用程序是由 Widget 缓存的树形结构 ,在 Flutter 中,sdk 提供了两个 默认的 Widget

  • StatelessWidget 渲染出的页面不会再次被更改
  • StatefulWidget 渲染出的页面会再次被更改

那么针对 StatefulWidget 这种 Widget 来讲,在实际开发中,渲染出的页面效果会随着数据的改变而改变,数据每改变一次那么页面重新渲染一次,每一次都对应一个状态,就是这里说的 State

在 React 的开发来讲

假如我们需要修改上术 state 引用的 date ,需要如下这样来写

  tick() {this.setState({date: new Date()});}

所以 Flutter 程序的设计中 State 与 React 的 State 大同小异,不过 Flutter 中的 State 设计的就更人性化了一点,一个 Widget 在被创建的时候就绑定了一个 State ,从 Widget 的出现 到消亡,也就是 Widget 的生命周期。

我们在创建一个 StatefulWidget 里通常会这样写

class CustomScrollDemoPage extends StatefulWidget {@overrideState<StatefulWidget> createState() {return ScrollHomePageState();}
}class ScrollHomePageState extends State{@overridevoid initState() {super.initState();}@overridevoid didChangeDependencies(){super.didChangeDependencies();}@overrideWidget build(BuildContext context) {}}

initState() 方法是在创建 State 对象后要调用的第一个方法,常常用做于初始化一些数据

在实际开发中,我们有时会在这个方法中使用到 context ,比如初始化一个字体颜色时,我们如下这样调用

Theme.of(context).primaryColor

常常会报错异常错误,这是因为 Context 可用 程序还没有完全将 State 与 Context 相关联起来,所以还不能使用,当 initState() 方法完全执行完毕后,State 与 Context 也就完全关联起来了。

didChangeDependencies() 方法是在 initState() 方法执行完毕后执行的第二个方法,在这个方法中, State 与 Context 已经完全关联起来了,所以可以使用 Context 。

对于生命周期方法didChangeDependencies只要是在当前页面的状态State与Widget的引用Context依赖关系发生变化时都会回调,目前在这里的案例中页面创建时有Context与当前页面的State绑定,在页面关闭时,有Context与当前页面的Context解绑,这两个过程都会回调didChangeDependencies方法

所以在 Flutter 中, StatefulWidget 、Context 、State 是一个不错的组合,当一个 Widget 继承于 StatefulWidget 来创建组件时,会调用StatefulWidget的 createElement方法,并t生成对就StatefulElement对象,

并保留widget引用也就是对应的 BuildContext ,

然后 将这个StatefulElement挂载到Element树上(也就是我们上面说的 Widgets树),

然后根据widget的 createState 方法创建State,

然后 StatefulElement对象调用state的build方法,并将element自身作为BuildContext传入

所以我们在build函数中所使用的context,正是当前widget所创建的Element对象,因为 context 就是 Element 元素的引用,实际指向。

5 看一看 of(context)方法

在上述代码中,我们有如下的写法

Theme.of(context).primaryColor

关键代码部分通过 context.rootAncestorStateOfType 向上遍历 Element tree,并找到最近匹配的 State。也就是说of实际上是对context跨组件获取数据的一个封装。


完毕

浅谈Flutter的状态State相关推荐

  1. 浅谈Flutter UI布局

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qiyei2009/article/de ...

  2. 浅谈flutter的优点与缺点

    Google不喜欢MPEG,于是推出了VP8.但打一开始他们就没在将其打造成一个真正的开放标准上做任何努力. Google不喜欢HTTP,于是推出了SPDY.但现在只有Chrome和Google的网页 ...

  3. 浅谈Flutter跨平台调用方式MethodChannel

    Flutter是目前非常流行的跨平台方案,由于它的性能接近于原生应用,因而被越来越多的开发者所采用.既然是跨平台方案,那么久必然存在调用系统功能的需求,在Flutter中,Flutter层与nativ ...

  4. 浅谈React的状态更新函数setState

    setState函数的参数 在使用react过程中,我们最频繁使用到的函数之一就是setState,该函数肩负着更改组件自身状态的职责.该函数的官方定义为:setState(updater[, cal ...

  5. java线程切换 notify_浅谈 Java线程状态转换及控制

    作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...

  6. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  7. 休眠后gpio状态_浅谈Digi XBee模块的休眠模式

    浅谈Digi XBee模块的休眠模式 2020-3-25 Digi XBee S2C模块,如果仅连接电源线可以测得,在待机情况下,大约是10.5mA左右的电流,在休眠时的功耗可以低到0.5uA.可以知 ...

  8. 浅谈大数据中的 2PC、3PC、Paxos、Raft、ZAB

    一致性 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的.假设一个具有N个节点的分布式系统,当其满足以下条件时,我们说这个系统满足一致性: 全认同: 所有N个节点都认同一个 ...

  9. 浅谈线程池(下):相关试验及注意事项

    三个月,整整三个月了,我忽然发现我还有三个月前的一个小系列的文章没有结束,我还欠一个试验!线程池是.NET中的重要组件,几乎所有的异步功能依赖于线程池.之前我们讨论了线程池的作用.独立线程池的存在意义 ...

最新文章

  1. python 解决IndentationError: unexpected unindent的报错!和通用代码框架,import requests def getHTMLText(url)...的解释
  2. Cell Press | 研究人员致力于创建COVID-19病毒表位图
  3. http81僵尸网络预警:专门攻击摄像头,国内5万台设备已沦陷
  4. 解决phoenix中创建的表名及字段默认是大写的问题
  5. C# 答群友:把窗体应用改成类库输出然后去引用
  6. 股价/期货等时间序列数据的整合检验、Grach建模
  7. hibernate java_Hibernate对Java 9的支持
  8. android studio 登录与注册,Android Studio实现QQ的注册登录和好友列表跳转
  9. Android 最常用的设计模式五 安卓源码分析——建造者模式
  10. [RK3288][Android5.1] 调试笔记 --- LVDS+EDP双屏机器调节白平衡色温
  11. Mentor.Graphics.FloTHERM.XT.2.3+Mentor.Graphics.Flowmaster.7.9.4
  12. python人民币和美元转换-Python实现制度转换(货币,温度,长度)
  13. bzoj 2818 欧拉函数
  14. 生物特征识别技术的标准化工作
  15. 一首能记住网线水晶头接法诗
  16. 41-fcntl设置文件锁
  17. crc16的c语言函数 计算ccitt_求一个C语言实现的CRC16/CCITT-FALSE校验码函数
  18. 关于dd命令的使用以及详解
  19. 56个清新文艺ppt模板
  20. 2022年汽车驾驶员(技师)试题及在线模拟考试

热门文章

  1. 150秒内诊断脑瘤!最新医学影像AI在《Nature Medicine》发表
  2. 内存占用少,计算速度快!华为诺亚方舟Lab开源即插即用的多用卷积核(NeurIPS 2018)...
  3. 干点大事!“覆盖25万人的AI资源对接平台”发布,找人、找技术不再难!
  4. 脑洞大开!拿Transformer和CNN比较!犯错都像人类
  5. 【EI会议】 2021年图像处理与智能控制国际学术会议(IPIC 2021)
  6. 北大读博手记:怎样完成自己的博士生涯?
  7. 带你自学Python系列(十七):Python中类的用法(三)
  8. 推荐系统遇上深度学习(六)--PNN模型理论和实践
  9. 使用Keras做猫狗分类
  10. android 3d模型ppt,PPT已支持3D PPT怎么插入3D模型?