Flutter DropdownMenu报期望String却得到List<dynamic>类型错误
问题根因
- 传参类型不匹配:
FutureBuilder返回的是Map<String, List<dynamic>>类型数据,调用snapshot.data!.values.toList()得到的是嵌套列表List<List<dynamic>>——即外层列表的每个元素都是一组下拉选项(本身也是List类型),但你的DropdownMenu组件要求接收的items参数是单层的List<dynamic>(每个元素是单个下拉选项,应为字符串类型)。原代码第45行直接把整个嵌套列表传给了DropdownMenu,后续遍历生成DropdownMenuItem时,传入Text组件的是List<dynamic>类型值,而Text组件要求入参为String,因此抛出类型错误。 - 自定义组件状态赋值逻辑写反:
_DropdownMenuState的initState中错误写为widget.items = items;,相当于把状态内未初始化的items(默认null)覆盖父组件传入的参数,存在空异常隐患,正确逻辑应该是将父组件传入的参数赋值给状态内部变量。
修复步骤
- 修正ListView构建时的传参逻辑:ListView.builder的itemBuilder按索引遍历每一组下拉选项,取对应索引的单个选项组传入DropdownMenu即可,对应第45行代码修改为:
return DropdownMenu(items: snapshot.data!.values.elementAt(index));
- 修正DropdownMenu状态类的初始化赋值逻辑:
@override void initState() { super.initState(); // 修正赋值方向,将父组件传入的选项列表赋值给状态内部变量 items = widget.items; }
调试打印异常说明
你之前调试时打印出嵌套类JSON结构,就是因为传参错误时传入的是嵌套列表,遍历取value.first作为key、整个子列表作为value,自然得到{'key': ['keyStrings', 'keyStrings']}格式的输出,和接口返回的数据结构本身无关。
内容的提问来源于stack exchange,提问作者ThisQRequiresASpecialist
相关产品推荐
相关产品推荐

