Flutter数组对象渲染DropdownMenuItem遇类型不匹配报错求助
你的代码主要有三个问题导致类型错误,逐一修正就能解决:
问题1:map返回的Iterable未转成List
listLorem.map()返回的是Iterable类型,直接放到items数组里会导致类型不兼容,需要转成List,这里可以用**展开运算符...**或者.toList()方法。
问题2:Map结构不能用点语法访问属性
你定义的listLorem是List<Map>,不是自定义类的对象,所以不能用items.someText这种点语法,必须用键索引items['someText']来取值。
问题3:DropdownMenuItem的value类型不统一
第一个下拉项的value是空字符串"",后面的是int类型的ids,两者类型冲突,必须统一类型:
- 要么把第一个项的value改成
null/0(对应int类型) - 要么把后面的
ids转成String类型item['ids'].toString()(对应字符串类型)
修正后的完整代码(Map结构版本)
// 建议显式定义类型,避免动态类型隐患 List<Map<String, dynamic>> listLorem = [ { "ids": 12, "someText": "Lorem Ipsum #12", }, { "ids": 11, "someText": "Lorem Ipsum #11", }, ]; // DropdownButton的items部分 items: [ DropdownMenuItem( child: Text("Choose One"), value: null, // 统一为int类型的null,或者改成"",后面对应转String ), // 用展开运算符把Iterable转成数组元素,同时修正属性访问 ...listLorem.map((item) => DropdownMenuItem( child: Text(item['someText']), value: item['ids'], )).toList(), ],
更规范的自定义类版本(推荐)
如果觉得Map访问麻烦,可以定义实体类来管理数据,代码更清晰:
// 定义实体类 class LoremItem { final int id; final String text; LoremItem({required this.id, required this.text}); } // 初始化列表 List<LoremItem> listLorem = [ LoremItem(id: 12, text: "Lorem Ipsum #12"), LoremItem(id: 11, text: "Lorem Ipsum #11"), ]; // DropdownButton的items部分 items: [ DropdownMenuItem( child: Text("Choose One"), value: null, ), ...listLorem.map((item) => DropdownMenuItem( child: Text(item.text), value: item.id, )).toList(), ],
内容的提问来源于stack exchange,提问作者Haksatrya Bhaswara
相关产品推荐
相关产品推荐

