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

Flutter如何从Map<String,String>生成带图片的DropdownMenuItem列表并解决报错

问题原因
  • 你的DropdownMenuItem没有显式设置value属性,所有选项的value默认都是null
  • DropdownButton本身没有指定当前选中的value参数,默认也是null
  • 断言校验会统计所有value等于当前选中值的选项数量,此时所有选项都匹配null,数量远大于1,触发报错
修复步骤
  1. 首先在你的State类中定义一个变量存储当前选中的鸡尾酒名称,初始值可以选Map里的某一个key
// 定义在State类中
String? _selectedDrink = 'Bloody Mary'; // 初始值必须是drinkNameToImage里存在的key
  1. 给每个DropdownMenuItem设置value属性,值为对应的鸡尾酒名称
  2. 给DropdownButton设置value属性绑定刚才定义的_selectedDrink,同时实现onChanged回调更新选中值
  3. 优化遍历Map的方式,用entries遍历更易读,不用单独通过索引取key和value

完整修复后代码如下:

// 定义在State类中
String? _selectedDrink = 'Bloody Mary';

Widget build(BuildContext context) {
  return DropdownButton<String>(
    // 绑定当前选中值
    value: _selectedDrink,
    // 实现选中回调
    onChanged: (newValue) {
      setState(() {
        _selectedDrink = newValue;
      });
    },
    items: drinkNameToImage.entries.map((entry) {
      return DropdownMenuItem<String>(
        // 给每个选项设置唯一value
        value: entry.key,
        child: Container(
          padding: const EdgeInsets.only(bottom: 5.0),
          height: 100.0,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              Image(image: AssetImage(entry.value)),
              Text(entry.key)
            ],
          ),
        ),
      );
    }).toList(),
  );
}
注意事项
  • 初始的_selectedDrink的值必须是drinkNameToImage中存在的key,不能是Map里没有的数值,否则会继续触发相同断言
  • 不推荐设置无初始选中的状态,如果初始值设为null,需要额外处理逻辑避免匹配不到选项触发断言
  • 显式给DropdownButton和DropdownMenuItem指定泛型String可以避免后续类型匹配错误
  • 如果你确实需要禁用下拉选择,保持onChanged: null即可,只要提前给value和每个DropdownMenuItem设置了匹配的唯一值,就不会触发报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:36:03