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

错误:在生成期间调用了setState()或markNeedsBuild()

错误:在生成期间调用了setState()或markNeedsBuild()

这个错误通常发生在Flutter应用程序中,它表示在构建期间调用了setState()或markNeedsBuild()方法。在Flutter中,构建期间是指在构建小部件树时,Flutter框架会调用小部件的build()方法来生成UI。在这个过程中,不能再次调用setState()或markNeedsBuild()方法,因为这会导致无限循环的构建。

解决这个错误的方法是避免在build()方法中调用setState()或markNeedsBuild()。通常,这个错误是由于在build()方法中的某个条件判断中调用了这些方法导致的。为了避免这个错误,可以将需要更新UI的逻辑放在其他地方,例如在事件处理程序中或在生命周期方法中。

以下是一个示例,展示了如何避免在build()方法中调用setState()或markNeedsBuild():

代码语言:txt
复制
class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  bool _isLoading = false;

  void fetchData() {
    setState(() {
      _isLoading = true;
    });

    // 模拟异步数据获取
    Future.delayed(Duration(seconds: 2), () {
      setState(() {
        _isLoading = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    if (_isLoading) {
      return CircularProgressIndicator();
    } else {
      return RaisedButton(
        child: Text('Fetch Data'),
        onPressed: fetchData,
      );
    }
  }
}

在上面的示例中,当点击按钮时,会调用fetchData()方法来获取数据。在fetchData()方法中,首先调用了setState()方法来更新_isLoading变量的值,然后使用Future.delayed()模拟异步数据获取,并在获取完成后再次调用setState()方法来更新_isLoading变量的值。这样可以避免在build()方法中调用setState()或markNeedsBuild(),从而避免了错误的发生。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(云原生、后端开发):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(数据库):https://cloud.tencent.com/product/cdb
  • 腾讯云服务器(服务器运维):https://cloud.tencent.com/product/cvm
  • 腾讯云CDN(网络通信):https://cloud.tencent.com/product/cdn
  • 腾讯云安全产品(网络安全):https://cloud.tencent.com/solution/security
  • 腾讯云音视频处理(音视频、多媒体处理):https://cloud.tencent.com/product/mps
  • 腾讯云人工智能(人工智能):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(物联网):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动开发):https://cloud.tencent.com/product/mobdev
  • 腾讯云对象存储(存储):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(区块链):https://cloud.tencent.com/product/baas
  • 腾讯云虚拟私有云(网络安全):https://cloud.tencent.com/product/vpc
  • 腾讯云游戏多媒体引擎(音视频、多媒体处理):https://cloud.tencent.com/product/gme
  • 腾讯云直播(音视频、多媒体处理):https://cloud.tencent.com/product/live
相关搜索:收到错误“在构建期间调用了setState()或markNeedsBuild()”在构建期间调用setState()或markNeedsBuild在使用提供程序生成期间调用setState()或markNeedsBuild()未处理的异常:在生成期间调用了setState()或markNeedsBuild()。BlocListener内幕在StreamBuilder内部构建期间调用setState()或markNeedsBuild()TextFormField:构建期间调用的setState()或markNeedsBuild()Flutter -构建期间调用的setState()或markNeedsBuild()显示和隐藏小部件生成错误期间调用的SetState()或markNeedsBuild()Flutter:在使用Provider构建期间调用的setState()或markNeedsBuild()在构建期间调用setState()或markNeedsBuild()。导致小部件的相关错误是RoundIconButton。A RenderFlex溢出Flutter Provider带有listen false,但仍然得到错误"setState()或markNeedsBuild()在构建期间被调用“。在构建过程中调用setState()或markNeedsBuild()Flutter Hooks使用构建期间调用的useEffect - setState()或markNeedsBuild()获取数据在构建期间调用setState()或markNeedsBuild(),在Flutter中使用FutureBuilder中的Provider和StreamBuilder在构建期间调用setState()或markNeedsBuild()。将GestureDetector放入容器中重构AKA后出错Flutter Provider - setstate或markneedsbuild()在构建过程中调用在颤动应用程序中出现错误时调用的setState()或MarkNeedsBuild()在构建期间调用setState()或markNeedsBuild()。尝试在flutter中创建一个简单的计时器为什么在构建过程中会出现快照错误和调用setState()或markNeedsBuild()?将数据传递给生成过程中调用的provider - setState()或markNeedsBuild()
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Flutter | 一文搞懂 BuildContext

    其实在 SetState 中,最终也是调用的 markNeedsBuild 方法,如下: void setState(VoidCallback fn) { assert(fn !...markNeedsBuild(); } 复制代码 我们写代码的过程中还会发现一个问题,就是要更新的状态不是必须要写在 setState 里面,只要写在 setState 上面 即可,这样也没有问题,...但是最后发现了这个问题的弊端了,如大多数人会在每个方法的后面加一个 setState,导致过度的开销,并且删除的时候也是不知道这个这个 setState 到底有没有实际的意义,这就会造成一些不必要的麻烦...所以 Flutter setState 中加了一个回,我们可以需要更新的状态直接放在回里面,和状态没关系的放在外边即可。...参考文献 B站王叔不秃 如果本文有帮助到你的地方,不胜荣幸,如有文章中有错误和疑问,欢迎大家提出!

    54630

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

    这个系列便是对 Flutter 绘制的探索,通过测试、调试及源码分析来给出一些绘制时被忽略从未知晓的东西,而有些要点如果被忽略,就很可能出现问题。...第一篇也说过,对于有 滑动 动画 需求的绘制,重建触发的频率非常大,此时即使对象是 轻量的,也会在短时间内创建大量对象,这样不是很好。...经过断言后,会执行回方法,并执行 _element.markNeedsBuild() 。可以看到 setState 方法主要就是执行这个方法,那 _enement 是什么呢? ?...这里只是调用了一下 ensureVisualUpdate。 ?...---- Provider 中,对刷新进行了一定的封装,但还是最终还是离不开 element#markNeedsBuild 。 ?

    1.9K20

    Widget的生命周期和渲染原理

    其实,所谓的生命周期,就是一系列的方法回,我们可以通过实现这些方法来捕获一个widget从加载到卸载全过程中的各个节点,以合适的时机做合适的事情。 那么我们可以利用生命周期方法做哪些事情呢?...我们知道,需要修改数据更新UI的时候,只要调用setState然后在其中更改数据,这样UI就可以随之改变了,这是因为setState函数可以触发widget的销毁重建,也就是会触发state的build...接下来我们看一下setState的源码: 可以看到,除了断言,这里面实际上就调用了一行代码: _element!....好,现在我们知道了通过setState来根据数据自动调整UI的原理了,因此,原则上我们是可以不调用setState而直接给element调用markNeedsBuild函数来实现UI的更新,即: StatefulWidget...StatefulElement; StatefulElement的构建函数中,调用了widget的createState函数来创建State,并且给创建出来的State对象的element和wiget

    1.3K20

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

    的text值,然后TextField数据框里的数据也及时改变了,其实最后还是用到setState。...这地方调用了_CreateInheritedProvider类的createState() 方法,安心了 performRebuild:该回会在setState或者build的时候会触发;此处做了一个判断...底下也调用了 startListening,说明从外面传进来的这个回也调用了,将 上下文实例 和 传进来的XxxProvider实例 作为入参传进了这个回中,此处传进来的回也通过 .call 被调用了...performRebuild回中会赋初值 reassemble回中,_delegateState调用了value( _delegateState.value ) 所以 get value 肯定会在初始化的时候被调用...markNeedsNotifyDependents 当我们使用 notifyListeners(),就会触发,这个回 此处调用了 markNeedsBuild(),然后给 _shouldNotifyDependents

    1.4K61

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

    、Persistent callbacks(Window.onDrawFrame的回)、Post-frame callbacks(Frame结束时只会被调用一次,调用后会被系统移除,Persistent..._newWidget = this; element.markNeedsBuild(); } return element; } element为空,owner先锁定状态,然后调用了RenderObjectToWidgetAdapter...通过setState触发构建 通常我们应用中要更新状态都是通过State中的setState方法来触发界面重绘,setState方法就是先调用了callback让后调用该State的Element对象的...markNeedsBuild方法,markNeedsBuild中将Element标记为dirty并通过BuildOwner将其添加到dirty列表中并调用onBuildScheduled回WidgetsBinding...初始化时设置的,它回去调用window.scheduleFrame方法),让后window的onBeginFrame,onDrawFrame回SchedulerBinding初始化时设置的,这两个回会执行一些

    99510

    Flutter框架分析(三)-- Widget,Element和RenderObject

    总的来说就是以下几点: Widget是对Element的配置描述。Flutter app开发者主要的工作都是和Widget打交道。...函数setState()我们很熟悉了。这个函数只是简单执行传入的回然后调用_element.markNeedsBuild()。你看,如果此时_element为空的时候会不会出问题?...所以建议大家调用setState()之前用mounted判断一下。另外要注意的一点是,这个函数也是触发渲染流水线的一个点。...我们都知道State有状态,当状态改变时对应的回函数会被调用。这些回函数其实都是StatefulElement里被调用的。...其内部实现主要是维护对其有依赖的子Element的Map,以及需要的时候调用子Element对应的didChangeDependencies()回,这里就不贴代码了,大家感兴趣的话可以自己去看一下源码

    1.3K10

    那些初学者实践 Flutter 最常出现的错误

    哔哩哔哩漫画APP实践Flutter 也有大半年时间了,我针对线上收集到的错误进行分析,挑选出了一些有一般代表性的错误,列本文,可供实践 Flutter 的初学者们作为一点参考。...典型错误一:无法掌握的Future 典型错误信息:NoSuchMethodError: The method 'markNeedsBuild' was called on null....异步任务结束页面被pop之后,但没有检查State 是否还是 mounted,继续调用 setState 就会出现这个错误。...又比如,动画监听的回里搞点事: @override void initState(){ _animationController.animation.addListener(_handleAnimationTick...); } void _handleAnimationTick() { if (mounted) updateWidget(...); } 同样的_handleAnimationTick被回

    3K21

    Flutter进阶-Key之GlobalKey

    owner可能有些同学会比较陌生,owner实际是BuildOwner的实例,WidgetBinding中持有生成,管理dirty和inactive的element。...实现原理: 开始探索原理之前,我们需要明白setState的流程,我们简单过一下,setState之后,会将当前widget(MyHomePage)markNeedsBuildmarkNeedsBuild...递归child更新,RenderObjectElement则是更新RenderObject,如果是带childchildren的RenderObjectElement最终也会调用到updateChild...本文例子中,我们更改了层级,updateChild方法中会进入deactivateChild(child);,然后重新inflateWidget生成新的element树。...答案是会的,但是build方法调用不代表我们的widget被重新绘制,Flutter中build方法是生成widget配置信息的,是很轻量也是会被频繁调用。

    1.8K20

    React核心原理与虚拟DOM

    推荐:调用setState时使用函数传递state值,函数中获取最新更新后的state。...大多数情况下,这没什么问题,但如果该回函数作为 prop 传入子组件时,这些组件可能会进行额外的重新渲染。我们通常建议构造器中绑定使用 class fields 语法来避免这类性能问题。...错误边界渲染期间、生命周期方法和整个组件树的构造函数中捕获错误。...代码优化点错误边界无法捕获以下场景中产生的错误:事件处理(了解更多)异步代码(例如 setTimeout requestAnimationFrame 回函数)服务端渲染它自身抛出来的错误(并非它的子组件...ReactDOM.render将生成好的虚拟DOM渲染到指定容器上,其中采用了批处理、事务等机制并且对特定浏览器进行了性能优化,最终转换为真实DOM虚拟DOM组成防止XSS: 借助Symbol.for(

    1.9K30
    领券