Flutter DropdownButton存在重复DropdownMenuItem值报错问题求助
报错原因
- 核心错误是你给所有
DropdownMenuItem配置了完全相同的value值,触发了Flutter对Dropdown选项值必须唯一的校验规则,同时还存在多处逻辑、类型不匹配的问题:
- 遍历
sugars列表生成选项时,你错误将整个sugars列表(而非当前遍历到的单个值sugar)赋值给了DropdownMenuItem的value属性,导致所有选项值完全一致 onChanged回调里错误将_currentSugars赋值为固定字符串'val',无法正常接收选中的参数值- 数据类型不统一:
updateUserData要求sugars为String类型,但_brewListFromSnapshot中给sugars设置的默认值是int类型的0,类型不匹配会导致Dropdown找不到对应选中值 - 提交更新时传的是
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
相关产品推荐
相关产品推荐

