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

Flutter DropdownButton存在重复DropdownMenuItem值报错问题求助

报错原因
  • 核心错误是你给所有DropdownMenuItem配置了完全相同的value值,触发了Flutter对Dropdown选项值必须唯一的校验规则,同时还存在多处逻辑、类型不匹配的问题:
  1. 遍历sugars列表生成选项时,你错误将整个sugars列表(而非当前遍历到的单个值sugar)赋值给了DropdownMenuItem的value属性,导致所有选项值完全一致
  2. onChanged回调里错误将_currentSugars赋值为固定字符串'val',无法正常接收选中的参数值
  3. 数据类型不统一:updateUserData要求sugars为String类型,但_brewListFromSnapshot中给sugars设置的默认值是int类型的0,类型不匹配会导致Dropdown找不到对应选中值
  4. 提交更新时传的是userData的原始值,而非表单修改后的_current开头的变量,修改结果无法同步到数据库
修复方案

1. 修正DropdownButtonFormField代码

DropdownButtonFormField(
  value: _currentSugars ?? userData.sugars, // 优先用修改后的临时值,否则用数据库默认值
  decoration: textInputDecoration,
  items: sugars.map((sugar) {
    return DropdownMenuItem(
      value: sugar, // 改为当前遍历的单个sugar值
      child: Text('$sugar sugars'),
    );
  }).toList(),
  onChanged: (val) => setState(() => _currentSugars = val.toString() ), // 去掉val的引号,接收选中值
),

2. 修正数据库类的类型不匹配问题

修改_brewListFromSnapshot方法,统一sugars为String类型:

List<Brew> _brewListFromSnapshot (QuerySnapshot snapshot) {
  return snapshot.documents.map((doc){
    return Brew(
        name: doc['name'] ?? '',
        sugars: doc['sugars'] ?? '0', // 原来的0改为字符串'0',和上层逻辑统一
        strength: doc['strength'] ?? 0, // 这里原来默认值写的是字符串'0',strength是int要改回数字0
    );
  }).toList();
}

3. 修正提交更新的参数

把RaisedButton的onPressed里的参数改成表单修改后的临时值:

onPressed: () async {
  if(_formKey.currentState!.validate()){
    await DatabaseServices(uid: user.uid).updateUserData(
      _currentSugars ?? userData.sugars, // 用修改后的糖量
      _currentName ?? userData.name, // 用修改后的用户名
      _currentStrength ?? userData.strength // 用修改后的浓度
    );
    // 可选操作:提交成功后返回上一页
    Navigator.pop(context);
  }
}

内容的提问来源于stack exchange,提问作者Osei-Nyansah Obed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 15:00:04