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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:53:14