Flutter开发:PODO类解析API报'Datum'无[]实例方法错误,如何获取下拉选中项testType值
报错原因
getTestType方法中,responsetestkit返回的data字段类型为List<Datum>,列表元素是自定义PODO类实例,并非Map结构,无法使用[]运算符取值,因此抛出Class 'Datum' has no instance method '[]'错误。getTestType是异步方法,调用后返回Future对象,直接赋值给_selectedTestType会出现类型不匹配,无法获取实际的testType值。- 逻辑冗余:当前页面已通过
FutureBuilder加载了完整的TestkitList数据,无需在选中回调中再次发起接口请求,造成性能浪费。
实现方案
方案一:最小改动适配现有代码
直接复用FutureBuilder快照中已有的数据,无需修改Dropdown的泛型定义:
- 删除冗余的
getTestType异步方法 - 修改
onChanged回调逻辑,直接从快照的现有列表中匹配选中id对应的Datum实例,读取testType:
onChanged: (newValue) { setState(() { _selectedTestkit = newValue; // 从快照数据中匹配对应条目,找不到则返回null final matchedItem = snapshot.data?.data?.firstWhere( (datum) => datum.id == newValue, orElse: () => null, ); // 直接读取对应testType _selectedTestType = matchedItem?.attributes?.testType; }); },
方案二:优化性能减少遍历逻辑
将Dropdown的泛型从String改为Datum类型,value直接存储完整的Datum实例,选中时无需额外遍历匹配:
- 提前定义状态变量存储选中的Datum实例:
Datum _selectedDatum; - 修改Dropdown组件的泛型和相关逻辑:
DropdownButtonFormField<Datum>( hint: Text("Select Testkit Name"), value: _selectedDatum, onChanged: (selectedItem) { setState(() { _selectedDatum = selectedItem; // 同时获取需要的id和testType值 _selectedTestkit = selectedItem?.id; _selectedTestType = selectedItem?.attributes?.testType; }); }, validator: (value) => value == null ? 'Please select the Testkit' : null, items: (snapshot.data?.data ?? []) .map((item) => DropdownMenuItem<Datum>( value: item, child: Text( item.attributes.name.length > 30 ? item.attributes.name.substring(0, 30) : item.attributes.name, ), )) .toList(), )
内容的提问来源于stack exchange,提问作者Joshi
相关产品推荐
相关产品推荐

