You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter报setState()/markNeedsBuild() called during build错误解决

问题原因
  • 核心错误是onTap的传参写法错误:onTap: _openDialog(context) 带括号调用方法的写法,会在Widget执行build的阶段直接运行_openDialog,而不是等用户点击组件时才触发。
  • showDialog运行时会标记全局Overlay组件需要重建,也就是触发markNeedsBuild()逻辑,但此时当前页面还处于构建流程中,Flutter不允许在构建阶段触发非当前构建链路上的组件重建,因此直接抛出setState() or markNeedsBuild() called during build报错。
  • onTap参数要求传入一个点击事件触发时才执行的回调函数,你当前的写法是把_openDialog(context)的执行结果直接赋值给onTap,根本没有传入合法的点击回调。
修复方法

修改onTap的传值,用匿名闭包包裹弹窗调用逻辑,保证弹窗方法只有在用户点击ListTile时才会执行,修改后的代码片段如下:

ListTile(
  title: Text('X').tr(),
  leading: Container(
    height: 30,
    width: 30,
    decoration: BoxDecoration(
      color: Colors.red,
      borderRadius: BorderRadius.circular(5)
    ),
    child: Icon("x", size: 20, color: Colors.white),
  ),
  trailing: Icon("x", size: 20,),
  // 替换原来的直接调用写法
  onTap: () => _openDialog(context),
),

补充说明:如果你的点击回调不需要传参数,可以直接传函数引用,比如无参的点击方法可以写onTap: _handleTap;但如果需要传入context这类参数,必须用匿名函数包裹调用,不能在属性赋值时直接加括号执行方法,否则必然会出现构建阶段提前执行方法的问题。

内容的提问来源于stack exchange,提问作者gurkan stack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:39:22