Flutter DropdownButton报错:存在重复值或匹配项数量不符
问题根源
这个断言错误的触发有两个核心原因:
- 选项列表存在重复值:你的
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
相关产品推荐
相关产品推荐

