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

Flutter DropdownButton报错:存在重复值或匹配项数量不符

解决Flutter DropdownButton断言错误:value需恰好对应一个选项

问题根源

这个断言错误的触发有两个核心原因:

  • 选项列表存在重复值:你的countries列表里有两个"USA",当选中该值时,DropdownButton会找到多个匹配的DropdownMenuItem,违反了"value必须恰好对应一个选项"的规则。
  • 初始value不合法:初始value设为空字符串'',这个值不在countries的选项范围内,同样会触发断言检查失败。

修复方案

1. 移除选项列表中的重复值

直接手动删除重复项,或者用代码自动去重:

// 手动去重后的列表
List<String> countries = [
  "Canada",
  "Russia",
  "USA",
  "China",
  "United Kingdom",
  "India"
];

// 或者用代码自动去重(适合动态生成的列表)
List<String> countries = [
  "Canada",
  "Russia",
  "USA",
  "China",
  "United Kingdom",
  "USA",
  "India"
].toSet().toList();

2. 修正初始value的合法性

有两种可选方案:

方案A:将初始value设为null(默认显示hint)

需要把value的类型改为可空,并同步修改DropdownButton的泛型:
控制器代码修改:

String? value = null; // 改为可空类型

List<String> countries = [
  "Canada",
  "Russia",
  "USA",
  "China",
  "United Kingdom",
  "India"
];

@override
changeValue(String? value) { // 参数同步改为可空
  this.value = value;
  update();
}

UI代码修改:

DropdownButton<String?>( // 泛型改为可空的String?
  isExpanded: true,
  hint: Text("Select Item"),
  items: controller.countries.map(buildMenuItem).toList(),
  onChanged: (value) => controller.changeValue(value),
  value: controller.value,
)
方案B:将初始value设为列表中的一个有效选项

比如设为列表的第一个元素:
控制器代码修改:

String value = "Canada"; // 初始值设为列表中存在的选项

List<String> countries = [
  "Canada",
  "Russia",
  "USA",
  "China",
  "United Kingdom",
  "India"
];

@override
changeValue(String value) {
  this.value = value;
  update();
}

3. 确保buildMenuItem函数正确生成选项

确认你的buildMenuItem函数正确绑定value,示例如下:

DropdownMenuItem<String> buildMenuItem(String item) {
  return DropdownMenuItem(
    value: item,
    child: Text(item),
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:32:33