Flutter下拉菜单重复值断言错误问题排查与解决
我在实现Flutter下拉选择框时遇到了断言错误,提示存在重复值,但明明数据源没有重复,尝试去重方法也无效,最终通过修改选项列表生成方式解决了问题,详情如下:
原始代码
var experienceYears = []; List<DropdownMenuItem<String>> getExperienceYears() { List<DropdownMenuItem<String>> items = []; for (var experienceYear in experienceYears) { items.add(DropdownMenuItem( value: experienceYear, child: Text(experienceYear.toString()), )); } return items; } DropdownButtonFormField( isExpanded: true, value: experienceTime, items: getExperienceYears(), onChanged: (selectedExperienceTime) { setState(() { experienceTime = selectedExperienceTime.toString(); }); }, decoration: const InputDecoration( border: OutlineInputBorder(), ), validator: (value) => (value as String?)?.isEmpty ?? true ? 'Tempo de experiência inválido' : null),
错误信息
DropdownButton的value对应的选项必须恰好有一个。检测到0个或2个及以上DropdownMenuItem具有相同值
断言失败:'package:flutter/src/material/dropdown.dart' 第1606行第15位
断言条件:items == null || items.isEmpty || value == null || items.where((item) => item.value == value).length == 1
调试结果
调试打印显示数据源和生成的选项列表均无重复,符合预期:
[DropdownMenuItem<String>, DropdownMenuItem<String>, DropdownMenuItem<String>, DropdownMenuItem<String>] [Menos de 1 ano, Entre 1 e 3 anos, Entre 3 e 5 anos, Mais de 5 anos]
排查过程
已确认experienceYears无重复值,experienceTime与数据源变量可区分,尝试在map后使用toSet()或distinct()去重,均未解决问题。
修复方案
将单独的getExperienceYears()方法替换为直接在items参数中通过map生成列表,问题解决:
items: experienceYears .map((experienceYear) => DropdownMenuItem( value: experienceYear, child: Text(experienceYear.toString()), )) .toList(),
内容来源于Stack Exchange,提问作者Caio
相关产品推荐
相关产品推荐

