首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Flutter的setState更新原理和流程

分析 Flutter状态类: StatelessWidget:无状态类,没有状态更新,界面一经创建无法更改; StatefulWidget:有状态类,当状态改变,调用setState()方法会触发StatefulWidget...的UI状态更新,自定义继承StatefulWidget的子类须重写createState()方法。...也就是只有当我们的类是有状态类的时候才能进行状态刷新,setState也是在State(有状态类)类里 解析 :framework.dart文件State类 调用 setState() 必须是没有调用过...if (mounted) { setState(() {}); } setState方法 void setState(VoidCallback fn) { ......等待下一次vsync信号的到来, 然后再经过层层调用最终会调用到 Window::BeginFrame() UI 的绘制逻辑是在 Render 树中实现的 更新帧信号来临从而刷新需要重构的界面 在 drawFrame

80820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    告别setState()! 优雅的UI与Model绑定 Flutter DataBus使用~

    Flutter开发中,大家都绕不开Widget的刷新,setState()是最简单的用法。...但随着当app的交互变得复杂,setState出现的次数便会显著增加,每次setState都会重新调用build方法,这势必对于性能以及代码的可阅读性带来一定的影响。...在key1的点击事件中往Stream中add数据,这样在key1的流上产生了一条数据,对应的监听者收到数据后,只更新自己的内容,不会重建其他区域。 ? ? ?...类似Provide的解决方案也需要设定顶级Widget,然后用consumer包裹子控件,调用更新等等操作。 有没有什么方式可以简化我们的使用呢?...DataBus是个人在开发中实践出一种极简的UI与Model的绑定方法,基于此实现一套普通页面框架,已实践过多个复杂页面。

    2.5K41

    android Handler更新UI

    android中经常需要更新界面某个元素的值,但是在主线程中是不可以直接更新主线程的值。这里推荐通过handler机制来更新值。...一Handler的定义: 主要接受子线程发送的数据, 并用此数据配合主线程更新UI.          ...解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发, 比如说, 你要是点击一个 Button, Android会分发事件到Button...这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的....子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。

    1.5K70

    flutter:一个bug的源码分析

    element关系的源码分析 bug现象 在页面本来有照片数据的(第一张照片数据),点击加号唤起系统拍照功能后,再返回页面A,原来的照片数据丢失了(部分Android机型上必现) bug原因和修复 照片跟UI...然后是页面调用setState,触发页面的刷新,log可以发现,widget被重新创建,而element跟state都没有重新创建 [log] TestWidget create const的widget...在这个demo的widget前面加上const,代表是不变的,在每次调用setState刷新的情况下,widget不会被重新创建了 return Column( children:...Widget.canUpdate(child.widget, newWidget)) { // 后续的刷新,其实是走到这里,widget重新创建了 // 创建后的widget跟旧的wiget...super(widget) { element创建的初始化方法中,会创建对应的state 总结 widget是immutable的,每次build都是重新创建新的widget 在app使用过程中,有各种数据UI

    38410

    Widget的生命周期和渲染原理

    我们知道,在需要修改数据更新UI的时候,只要调用setState然后在其中更改数据,这样UI就可以随之改变了,这是因为setState函数可以触发widget的销毁重建,也就是会触发state的build...好,现在我们知道了通过setState来根据数据自动调整UI的原理了,因此,原则上我们是可以不调用setState而直接给element调用markNeedsBuild函数来实现UI的更新,即: 在StatefulWidget...的build方法中将context转成StatefulElement类型的element,然后直接在对应的数据更新完了之后,手动调用element.markNeedsBuild(),这样就能够实现UI的更新了...但我们开发的时候不会这样去用,因为setState里面做了很多assert断言的容错判断,会更加安全。...在该函数中会创建一个StatefulElement; 在StatefulElement的构建函数中,调用了widget的createState函数来创建State,并且给创建出来的State对象的element和wiget

    1.3K20

    线程与更新UI,细谈原理

    进入正题,大家应该都听过这样一句话——“UI更新要在主线程,子线程更新UI会崩溃”。久而久之就感觉这是个真理,甚至被认为是“官方结论”。 但是如果问你,官方什么时候在哪里说过这句话,你会不会有点懵。...废话有点多了,今天还是通过实践案例,看看这个关于线程和UI更新的 “官方结论” 正确吗?...Button的宽度为固定不崩溃。...检查线程,其实就是检查更新UI操作的当前线程是不是当初创建UI的那个线程,这样就保证了线程安全,因为UI控件本身不是线程安全的,但是加锁又显得太重,会降低View加载效率,毕竟是跟交互相关的。...总结 任何线程都可以更新UI,也都有更新UI导致崩溃的可能。

    85220

    Flutter 绘制探索 4 | 深入分析 setState 重建和更新 | 七日打卡

    这里的返回值是为了更新 this 节点的 _child 属性,也就是更新 第三元素节点 当 newWidget 为 null 时,会返回 null,且 child 不为 null 时,会被从树上移除。...---- 由于新旧 Widget 不是同一对象,就会走下面分支,判断 Widget 是否可以更新。可更新的条件是:新旧组件的运行时类型和 key 一致 ,这里是满足的,继续向下。 ?...也就是说,使用 setState 进行更新,只是轻量级的配置信息创新创建,而 Element 、RenderObject 、State 这样的对象不会重新创建,只是根据配置信息进行了更新。 ?...这就是在 setState 时进行的 Element 重新构建 和 RenderObject 的更新。...我们应该已经了解到,一般情况下使用 setState 不会让 Element 和 RenderObject 重新创建,而是基于新的 Widget 配置信息进行更新。这差不多就是四两拨千斤吧。 ?

    2K20

    首页快照不更新么?投诉试试吧!

    博主纳闷了,虽然知道有自己的原因,但是我回到深圳之后,立即就恢复了更新频率及更新规律。为啥快照却没任何动静?...虽然,投诉中心收到的回复都是忽悠的套话,但是管你如何回复,咱们也只要见到效果就行,所以快照迟迟不更新的筒子们,赶紧去试试投诉吧! 产品管理员回复: 1.博客首页快照一直不更......网页 2014-02-25 已处理 详细说明: 博客更新频率一直很正常,一天一篇。但从 1 月 23 号开始,首页的百度快照就未更新过了。特来百度快照投诉,请求管理员解决。...## 另外提示您:本系统仅受理原网站删除或更新的投诉,原网站未变化的,建议您联系原网站删除原链接内容,百度系统会机器自动更新给予修正,或者按照“百度权利声明 http://www.baidu.com/duty...最后按国际惯例还是总结一下,个人补充的百度快照迟迟不更新的处理办法: 保持更新频率 尽量发原创文章 网站信息勿乱动(主副标题、描述以及关键字等) 检查是否存在死链 检查是否存在异常友链 期间不要使用外链工具

    2.2K150
    领券