Flutter DropdownButton报_AssertionError断言错误如何解决
问题根因
- 绑定值与菜单项值不匹配:初始
currentValue赋值为字符串"1",但代码生成的DropdownMenuItem的value是工作类型显示文本(如"Full-time"),所有菜单项里不存在value为"1"的选项,匹配到的同值项数量为0,直接触发框架断言:DropdownButton要求绑定的value必须在菜单项value集合中恰好存在1次,或value为null。 - 菜单项生成逻辑错误:现有条件判断逻辑会根据
currentValue只渲染1个对应选项,正常下拉选择组件需要一次性展示所有可选项,否则用户无法看到并选择其他工作类型。 - 参数映射逻辑缺失:回调中直接把选中的显示文本传给接口,不符合「选Full-time传1、Part-time传2、Internship传3」的业务要求。
修复步骤
- 先定义固定的文本-参数映射表,统一管理显示值和提交参数的对应关系,修正初始选中值:
// 工作类型 显示文本 <-> 接口提交参数 映射 const Map<String, String> jobTypeValueMap = { "Full-time": "1", "Part-time": "2", "Internship": "3" }; // 初始选中值必须是菜单项中存在的value,默认选全职 String currentValue = "Full-time";
- 修正
DropdownButton的items生成逻辑,一次性渲染所有可选项,不要加条件判断只生成单个选项:
DropdownButton( hint: const Text("Select Job type"), value: currentValue, isDense: true, icon: const Icon(Icons.keyboard_arrow_down), // 遍历映射表的key(所有工作类型文本)生成全部下拉选项 items: jobTypeValueMap.keys.map((String typeName) { return DropdownMenuItem( value: typeName, child: Text(typeName), ); }).toList(), onChanged: onChangedCallback, )
- 修正选中回调逻辑,提交接口时从映射表取对应的数字参数,StatefulWidget场景下需要调用
setState触发UI更新:
Future<void> onChangedCallback(String? item) async { if (item != null) { // StatefulWidget中必须包裹setState更新选中状态,否则UI不会刷新 setState(() { currentValue = item; }); final url = "my-api-link"; // 从映射表取对应数字参数提交接口 final body = {"job_type": jobTypeValueMap[item]}; final response = await http.post(Uri.parse(url), body: body); print(response.body); } }
校验规则说明
Flutter 官方
DropdownButton组件的强制校验逻辑:要么items为空/value为null,要么所有菜单项中必须恰好有1项的value和组件绑定的value相等,出现0个或多个重复匹配项时就会抛出你遇到的_AssertionError。
内容的提问来源于stack exchange,提问作者Zemichael Muluken
相关产品推荐
相关产品推荐

