Flutter应用报错:build期间调用setState()或markNeedsBuild()
Flutter断言错误:setState() or markNeedsBuild() called during build 修复方案
问题描述
运行Flutter Quiz应用时触发断言错误:
构建Answer(dirty)时抛出提示:setState() or markNeedsBuild() called during build。
详细错误信息显示MyApp组件在框架构建过程中无法被标记为需要重建,触发错误的组件路径为file:///E:/Program%20Files%20(x86)/AndroidStudioProjects/quiz/lib/quiz1.dart:27:18
错误原因
问题出在Answer组件的ElevatedButton配置上:
onPressed: selectHandler(),
这里的selectHandler()是直接调用函数,会在组件构建阶段立即执行,而selectHandler最终会触发_answerQuestion里的setState()——Flutter明确禁止在组件构建过程中调用setState()来标记组件需要重建,因此触发断言错误。
解决方案
将onPressed的赋值改为传递函数引用,去掉调用的括号:
onPressed: selectHandler,
这样函数只会在按钮被点击时执行,而非组件构建阶段。
修改后的Answer组件完整代码
import 'package:flutter/material.dart'; class Answer extends StatelessWidget { final Function selectHandler; final String answerText; const Answer(this.selectHandler, this.answerText, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { return SizedBox( width: double.infinity, child: ElevatedButton( onPressed: selectHandler, // 移除了调用括号 style: ButtonStyle( textStyle: MaterialStateProperty.all(const TextStyle(color: Colors.white)), backgroundColor: MaterialStateProperty.all(Colors.green)), child: Text(answerText), ), ); } }
额外提示
检查_questions列表中的拼写错误:部分条目使用了questionTest而非正确的questionText,这会导致后续获取题目文本时出现异常,建议统一修正为questionText。
内容的提问来源于stack exchange,提问作者IconicTelomere
相关产品推荐
相关产品推荐

