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

如何解决Flutter中DropdownButton报value为null匹配项数量异常的错误

报错原因

你遇到的报错如下:

There should be exactly one item with [DropdownButton]'s value: null.
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value

核心触发原因有两个:

  1. 初始状态下supplier变量为null,但你生成的DropdownMenuItem列表中没有值为null的选项,无法匹配到对应项
  2. 小概率为供应商返回数据存在重复id,导致多个下拉项的value属性重复

修复步骤

  • 第一步:明确变量类型,避免类型不匹配
    将原变量定义修改为:
String? supplier; // 和下拉项value的字符串类型对齐,声明为可空字符串
List _supplierDetails = [];
  • 第二步:适配初始空值,二选一即可

方案1:新增加载判断,数据未拉取完成时显示占位

// 数据为空时显示加载动画,避免空下拉列表报错
_supplierDetails.isEmpty ? const CircularProgressIndicator() : DropdownButton(
  hint: const Text('Select Supplier'),
  items: _supplierDetails.map((list) {
    return DropdownMenuItem(
      child: Text(list['Name']),
      value: list['id'].toString(),
    );
  }).toList(),
  onChanged: (value) {
    setState(() {
      supplier = value as String?;
    });
  },
  value: supplier,
)

方案2:新增默认空选项,适配初始null值

如果不需要加载占位,可以直接在下拉项列表中新增一个值为null的默认选项:

DropdownButton(
  hint: const Text('Select Supplier'),
  items: [
    // 新增默认选项,值与初始的supplier空值匹配
    const DropdownMenuItem(
      value: null,
      child: Text('Select Supplier'),
    ),
    // 展开原有供应商选项
    ..._supplierDetails.map((list) {
      return DropdownMenuItem(
        child: Text(list['Name']),
        value: list['id'].toString(),
      );
    }).toList()
  ],
  onChanged: (value) {
    setState(() {
      supplier = value as String?;
    });
  },
  value: supplier,
)
  • 第三步(可选校验):检查服务端返回的供应商数据是否存在重复id,如果有重复需要服务端修正,或前端先做去重处理,避免多个下拉项的value重复触发报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:24:03