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

Flutter ListView选中项颜色异常:点击单一项所有项同步变色

问题根源

你当前用了一个全局的isCorrect变量控制所有选项的颜色,点击任意选项时都会修改这个变量,导致所有OptionField组件都接收到同一个状态值,所以全部选项同时变色。

解决方案

需要单独记录被选中的选项索引以及该选项的对错状态,让每个选项只根据自己的选中状态切换颜色。以下是具体修改步骤:

1. 替换全局状态变量

在你的State类中,把原来的int isCorrect替换为记录选中索引和对错的变量:

// 记录被选中的选项索引,未选中时为null
int? selectedIndex;
// 记录选中选项的对错状态
bool? isAnswerCorrect;

2. 修改ListView的点击逻辑

更新onTap方法,点击时记录当前选中的索引和该选项是否正确:

onTap: () {
  bool correct = widget.QandAnsList[questionCounter].Answers[index] == 
                  widget.QandAnsList[questionCounter].CorrectAnswer;
  setState(() {
    selectedIndex = index;
    isAnswerCorrect = correct;
  });
},

3. 修改OptionField的参数传递

调用OptionField时,只给被选中的选项传递正确/错误状态,其他选项保持未选中状态:

child: OptionField(
  option[index],
  widget.QandAnsList[questionCounter].Answers[index],
  ValueKey(index.toString()),
  // 仅当前选项是选中项时,返回对应状态,否则返回0(未选中)
  selectedIndex == index ? (isAnswerCorrect! ? 1 : 2) : 0,
),

可选:用Map管理多选项状态(更灵活)

如果需要支持更复杂的状态管理(比如保留历史选中状态),可以用Map记录每个选项的状态:

// State类中定义
Map<int, int> optionStatus = {};

@override
void initState() {
  super.initState();
  // 初始化4个选项为未选中状态(0)
  for (int i = 0; i < 4; i++) {
    optionStatus[i] = 0;
  }
}

修改点击逻辑:

onTap: () {
  bool correct = widget.QandAnsList[questionCounter].Answers[index] == 
                  widget.QandAnsList[questionCounter].CorrectAnswer;
  setState(() {
    // 单选模式下,先重置所有选项为未选中
    optionStatus.updateAll((key, value) => 0);
    // 设置当前选中选项的状态
    optionStatus[index] = correct ? 1 : 2;
  });
},

传递参数给OptionField:

child: OptionField(
  option[index],
  widget.QandAnsList[questionCounter].Answers[index],
  ValueKey(index.toString()),
  optionStatus[index]!,
),

说明

这样修改后,每个选项只会根据自己的索引判断是否是被选中的项,只有被点击的选项才会切换为绿色或红色,其他选项保持白色。你之前设置的ValueKey能确保ListView的item正确复用,无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 12:30:51