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
相关产品推荐
相关产品推荐

