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

Flutter封装复用的DropdownButton值不更新,setState不生效如何解决

问题原因

你封装的buildDropdown方法中的selectedValue是函数的传入参数,属于局部变量,你在onChanged回调里修改的只是这个局部变量的值,并没有更新State类中存储状态的selectedCredit/selectedGrade列表的对应元素。即便调用了setState,重新构建组件时传入buildDropdown的依旧是状态列表里的旧值,所以下拉框的选中状态不会发生变化。

解决方案

修改思路是给buildDropdown方法新增回调参数,选中新值时直接修改外部状态列表的对应元素,具体修改如下:

  1. 调整buildDropdown方法的定义,接收外部传入的选中回调:
DropdownButton<String> buildDropdown({
  required String? selectedValue,
  required List<String> selectedList,
  required Function(String?) onChanged, // 新增回调参数
}) {
  return DropdownButton(
    value: selectedValue,
    items: selectedList.map((location) {
      return DropdownMenuItem(
        value: location,
        child: Text(
          location,
          style: kDropdownTextStyle,
        ),
      );
    }).toList(),
    onChanged: onChanged, // 直接使用外部传入的回调逻辑
  );
}
  1. 在dataRow方法中调用buildDropdown时,传入修改对应状态的逻辑:
Row dataRow({required int index}) {
  return Row(
    mainAxisAlignment: MainAxisAlignment.spaceAround,
    children: [
      Text(
        '${index+1}',
        style: kGPATextStyle,
      ),
      buildDropdown(
        selectedValue: selectedCredit[index],
        selectedList: _credits,
        onChanged: (newValue) {
          setState(() {
            selectedCredit[index] = newValue; // 直接修改学分列表对应位置的状态值
          });
        },
      ),
      buildDropdown(
        selectedValue: selectedGrade[index],
        selectedList: _grades,
        onChanged: (newValue) {
          setState(() {
            selectedGrade[index] = newValue; // 直接修改成绩列表对应位置的状态值
          });
        },
      ),
    ],
  );
}

修改后选中值会直接同步更新到状态列表中,setState触发重绘时下拉框就可以正确显示最新选中值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:45:00