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

Flutter Provider带有listen false,但仍然得到错误"setState()或markNeedsBuild()在构建期间被调用“。

Flutter Provider是Flutter中的一个状态管理库,它提供了一种简单而强大的方式来管理应用程序的状态。在使用Provider时,可以通过设置listen参数来控制是否在状态变化时重新构建相关的Widget。

当使用Provider时,如果将listen参数设置为false,意味着相关的Widget不会监听状态的变化,因此不会重新构建。然而,即使设置了listen为false,仍然可能会出现错误"setState()或markNeedsBuild()在构建期间被调用"的情况。

这个错误通常是由于在Widget的build方法中调用了setState()或markNeedsBuild()导致的。即使listen为false,当状态发生变化时,Provider仍然会通知相关的Widget进行重建,而在重建过程中调用了setState()或markNeedsBuild(),就会触发这个错误。

要解决这个问题,可以尝试以下几种方法:

  1. 确保在Widget的build方法中不要调用setState()或markNeedsBuild(),因为这些方法会触发重建。
  2. 检查是否有其他地方调用了setState()或markNeedsBuild(),例如在Provider的回调函数中。如果有,可以尝试将其移除或修改逻辑。
  3. 如果需要在状态变化时执行一些操作,可以考虑使用Provider的回调函数或Consumer来处理,而不是在Widget的build方法中进行操作。

总之,尽管设置了listen为false,但仍然需要注意在Widget的build方法中不要调用setState()或markNeedsBuild(),以避免出现"setState()或markNeedsBuild()在构建期间被调用"的错误。

关于Flutter Provider的更多信息和使用示例,可以参考腾讯云的相关文档和示例代码:

  • Flutter Provider文档:https://cloud.tencent.com/document/product/851/19712
  • Flutter Provider示例代码:https://github.com/TencentCloud/FlutterTencentCloud/blob/main/lib/provider_example.dart
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Flutter完整开发实战详解(十五、全面理解State与Provider)

了解这个两个概念后,我们先看下图, Flutter构建一个 Widget ,首先会创建出这个 Widget 的 Element ,而事实上 State 实现跨帧共享,就是将 State 保存在Element...中,这样 Element 每次调用 Widget build() 时,是通过 state.build(this); 得到的新 Widget ,所以写在 State 的数据就得以复用了。...问题就在于前面 StatefulElement 的构建方法和 update 方法: State 只 StatefulElement 的构建方法中创建,当我们调用 setState 触发 update...我们常说的 setState ,其实是调用markNeedsBuildmarkNeedsBuild 内部会标记 element 为 diry,然后在下一帧 WidgetsBinding.drawFrame...listener 内会调用 StateDelegate 的 StateSetter 方法,从而调用到 StatefulWidget 的 setState

3.6K21

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

Flutter 中所有可以看得到的组件,比如 Text、Image、Switch、Slider 等等,追其根源都是画出来的,但通过查看源码可以发现,Flutter 中绝大多数组件并不是使用 CustomPaint...这个系列便是对 Flutter 绘制的探索,通过测试、调试及源码分析来给出一些绘制时忽略从未知晓的东西,而有些要点如果忽略,就很可能出现问题。...现在也就是即将调用这个 Element 对象的 markNeedsBuild() 方法。 ? ---- 下一步就会进入 Element.markNeedsBuild,也就是 Element 类中。...这就是 setState 时进行的 Element 重新构建 和 RenderObject 的更新。...---- Provider 中,对刷新进行了一定的封装,但还是最终还是离不开 element#markNeedsBuild 。 ?

1.9K20
  • 【源码篇】Flutter Provider的另一面(万字图文+插件)

    关于Provider的源码,如果对设计模式面向接口编程不熟悉的话,看起来是相当懵逼的,基本就是:懵逼树上懵逼果,懵逼树下你和我;Provider源码使用了大量的抽象类,调用父类构造函数,继承实现断言,...Provider.of(context, listen: false)中的context,必须是ChangeNotifierProvider其子Widget的 使用ProEasyCounterPage..., ); } } _InheritedProviderScope 这里是继承了InheritedWidget,里面重写createElement方法,构建Widget的时候,这个方法是肯定会被调用的...通过上面的五步回溯,我们可以断定一个事实:_InheritedProviderScopeElement(实现BuildContext) 实例化了,而且他初始化的时候调用了,对应的,其内部相应的周期也能正常触发...这里直接给出结论了,还是 _InheritedProviderScopeElement这个上下文类里面 reassemble:全局状态的初始化逻辑热重载的时候调用 _delegateState首先在

    1.4K61

    Flutter完整开发实战详解(十一、全面深入理解Stream)

    一、Stream 由浅入深 Stream Flutter 是属于非常关键的概念, Flutter 中,状态管理除了 InheritedWidget 之外,无论 rxdart,Bloc 模式,flutter_redux...); 执行 1 中得到的 _onData 对象,触发 listen 时传入的回调方法。...二、StreamBuilder 如下代码所示, Flutter 中通过 StreamBuilder 构建 Widget ,只需提供一个 Stream 实例即可,其中 AsyncSnapshot 对象为数据快照...中会调用 _subscribe 方法,从而调用 Stream 的 listen,然后通过 setState 更新UI,就是这么简单有木有?...我们常用的 setState 中其实是调用markNeedsBuildmarkNeedsBuild 内部标记 element 为 diry ,然后在下一帧 WidgetsBinding.drawFrame

    3.8K41

    Flutter | 启动,渲染,setState 流程

    组件树构建完毕后,回到 runApp 的实现中,当调完 attachRootWidget 后,最后一行会调用 WidgetsFlutterBainding 实例的 scheduleWarmUpFrame...() 方法,该方法的是现在 SchedulerBinding 中,他调用后会立即进行一次绘制,在此次绘制结束前,该方法就会锁定事件分发,也就是说本次绘制结束完成之前 Flutter 不会响应各种事件...2,当我们调用 window.scheduleFrame 方法之后,Flutter 引擎会在合适时机(可以认为是屏幕下一次刷新之前,具体取决于 Flutter 引擎实现) 来调用 onBeginFrame..._inDirtyList = true; } 复制代码 当调用 setState 后: 1,首先调用 markNeedsBuild 方法,将 element 的 dirty 标记为 true,表示需要重建...上屏,会将绘制出的bit数据发送给GPU .....///// } } 复制代码 以上,便是 setState 调用的大概过程,实际的流程会更加复杂一点,例如在这个过程中不允许再次调用 setState

    1.2K10

    Widget的生命周期和渲染原理

    我们知道,需要修改数据更新UI的时候,只要调用setState然后在其中更改数据,这样UI就可以随之改变了,这是因为setState函数可以触发widget的销毁重建,也就是会触发state的build...好,现在我们知道了通过setState来根据数据自动调整UI的原理了,因此,原则上我们是可以不调用setState而直接给element调用markNeedsBuild函数来实现UI的更新,即: StatefulWidget...8,dispose 当State对象永久地从视图树中移除时,Flutter调用dispose函数。...Widget的渲染原理 关于Widget的渲染,我Widget,构建Flutter界面的基石中有过介绍,本文也是依次为基准,再做一些拓展介绍。...StatefulElement; StatefulElement的构建函数中,调用了widget的createState函数来创建State,并且给创建出来的State对象的element和wiget

    1.3K20

    flutter渲染详解

    _newWidget = this; element.markNeedsBuild(); // markNeedsBuildsetState更新原理和流程有讲到 } return.../// ///如果给定的小部件具有全局键并且已经存在一个元素有一个带有该全局键的小部件,此函数将重用该元素 ///(可能从树中的其他位置移植重新激活从无效元素列表中获取),而不是创建一个新元素。...///如果任何预定的帧已经开始其他[scheduleWarmUpFrame]已被调用,此调用将被忽略。 ///首选[scheduleFrame]正常操作下更新显示。...; } buildOwner.buildScope()我们的"setState更新原理和流程"有讲到过,可以直接搜索。...该方法会将被标记为dirty的Element进行重新构建。 回收抛弃的Element的列表_inactiveElements最后会调用buildOwner.finalizeTree()彻底清除掉。

    1.2K20

    从零开始的Flutter之旅: Provider

    而state的改变会导致build的重新构建,导致的效果是CountWidget的build重新调用,继而它的子widget也相继重新build。...中对可监听的data合适的地方进行监听订阅与移除订阅,并在收到data数据改变时调用notify进行setState操作,通知widget刷新。...所以为了避免RaisedButton引用的共享数据进行自增时重新build,这里将listen参数置为false。...以上是一个简单的Provider-Consumer的使用。Flutter对这一块有更完善的实现方案。但是经过我们这一轮分析,你再去看FlutterProvider的源码将会更加简单易懂。...如果你想了解FlutterProvider的使用,你可以通过flutter_github来了解它的具体实战使用技巧。 想要查看Provider实战技巧,需要将分支切换到sample_provider

    73820

    Flutter框架分析(四)-- Flutter框架的运行

    ; _element.markNeedsBuild(); } 这里会调用到Element的markNeedsBuild()函数。...原因是这些回调函数只会被调用一次。注意看代码里_transientCallbacks置为空Map了。如果想在下一帧再次调用的话需要提前重新设置回调。这些回调主要和动画有关系。...渲染流水线的构建(build),布局(layout)和绘制(paint)阶段都是在其中一个回调里的。 “Post-Frame”回调主要是新帧渲染完成以后的一类调用,此类回调只会被调用一次。...此时渲染流水线就进入了构建(build)阶段。接下来调用了super.drawFrame()。这个函数定义RendererBinding中。...总结 本篇文章从我们熟悉的State.setState()函数出发,大致介绍了Flutter框架是如何运行渲染流水线的。

    86040

    Flutter学习之构建、布局及绘制三部曲

    构建 初次构建 flutter的入口main方法直接调用了runApp(Widget app)方法,app参数就是我们的根视图的Widget,我们直接跟进runApp方法 void runApp(...时 //2.当Element第一次构建由mount方法去调用 //3.当Widget改变时,update方法调用 void rebuild() { if (!...('building $this', e, stack));//有错误的化就创建一个ErrorWidget } finally { _dirty = false; } try { _child...通过setState触发构建 通常我们应用中要更新状态都是通过State中的setState方法来触发界面重绘,setState方法就是先调用了callback让后调用该State的Element对象的...markNeedsBuild方法,markNeedsBuild中将Element标记为dirty并通过BuildOwner将其添加到dirty列表中并调用onBuildScheduled回调(WidgetsBinding

    99510

    【源码篇】Flutter GetX深度剖析 | 我们终将走出自己的路(万字图文)

    方法中,传入Element调用了自身didChangeDependencies()方法 Element的didChangeDependencies() 方法会调用 markNeedsBuild() ,来刷新自身...相关原理,可参考下面文章 源码篇:Flutter Provider的另一面(万字图文) 图示 来看下InheritedWidget刷新机制的图示 [InheritedWIdget刷新机制] 路由小知识...实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。 基于构造函数。实现特定参数的构造函数,新建对象时传入所依赖类型的对象。 基于注解。...类中 可以发现,_updaters中泛型就是一个方法 GetBuilder中添加的监听就是一个方法参数,方法体里面就是 setState() 齐活了!...源码篇:Flutter Bloc背后的思想,一篇纠结的文章 源码篇:Flutter Provider的另一面(万字图文+插件)

    4.1K52

    Flutter进阶-Key之GlobalKey

    我们这不做深入讨论,只需要知道element树构建中是会将owner传递,即共享一个owner对象。...实现原理: 开始探索原理之前,我们需要明白setState的流程,我们简单过一下,setState之后,会将当前widget(MyHomePage)markNeedsBuildmarkNeedsBuild...递归child更新,RenderObjectElement则是更新RenderObject,如果是带childchildren的RenderObjectElement最终也会调用到updateChild...答案是有的,inflateWidget递归构建新的element树时,会判断widget key是否是GlobalKey,是的话尝试调用_retakeInactiveElement,_retakeInactiveElement...答案是会的,但是build方法调用不代表我们的widget重新绘制,Flutter中build方法是生成widget配置信息的,是很轻量也是会被频繁调用

    1.8K20

    Flutter 刷新页面:通过下拉刷新提升用户体验

    当用户下拉页面时,这个函数调用,它的任务是拉取新的数据并更新我们应用中状态。很重要的一点是,这个函数返回 Future 来保持刷新指示器可见,直到新数据下载且页面更新。...和 Callbacks 刷新数据 Flutter 社区,Provider 是一个很受欢迎状态管理解决方案。...当在 Flutter 中实现下拉刷新,使用 Provider,我们需要通过一个 provider 来暴露一个方法来刷新数据,然后 onRefresh 回调函数中调用该方法。...构建用于刷新功能的 Widget Tree 一个 Flutter 应用中创建一个直观且响应式 pull-to-refresh 特性,需要细心构建 widget tree。...这种方法可以让用户了解情况,并让他们了解应用程序内发生的情况,特别是刷新操作花费的时间比预期更长失败情况下。

    27110
    领券