Flutter DropdownButton报List<dynamic>不是List<DropdownMenuItem<Partner>>?子类型
问题原因
你遇到的类型不匹配错误核心是Dart的类型推断没有识别出map方法生成的元素类型是DropdownMenuItem<Partner>,最终toList()返回的是默认的List<dynamic>,和DropdownButton要求的items类型不匹配。
修复步骤
1. 修正下拉组件的类型声明与map泛型
把下拉组件的代码调整如下:
Container( child: FutureBuilder<List<Partner>>( future: AllPathLab(), // 给AsyncSnapshot指定泛型,明确snapshot.data的类型 builder: (BuildContext context, AsyncSnapshot<List<Partner>> snapshot) { if (snapshot.connectionState != ConnectionState.done) { return const CircularProgressIndicator(); } if (snapshot.hasError) { return const Text("Something went wrong"); } if (snapshot.hasData) { return DropdownButton<Partner>( dropdownColor: Colors.white, underline: const SizedBox(), isExpanded: true, // 1. 加!确认data非空,2. 给map指定泛型,明确生成的元素类型 items: snapshot.data!.map<DropdownMenuItem<Partner>>((Partner data) => DropdownMenuItem<Partner>( child: Text(data.partnerName), value: data, ) ).toList(), onChanged: (value){ // 后续补充选中逻辑即可 }, ); } return const Text("Waiting for Internet Connection"); }, ), )
2. 修正Partner类的空安全问题(必做,避免后续崩溃)
你当前的Partner类中partnerName声明为非空String,但fromJson方法里会给它赋值null,类型不匹配,需要调整为可空类型:
class Partner { Partner({ required this.encPartnerId, this.partnerName, // 去掉required }); String encPartnerId; String? partnerName; // 改为可空类型 factory Partner.fromJson(Map<String, dynamic> json) => Partner( encPartnerId: json["EncPartnerId"], partnerName: json["PartnerName"], ); Map<String, dynamic> toJson() => { "EncPartnerId": encPartnerId, "PartnerName": partnerName, }; }
额外优化
你的AllPathLab函数里jsonDecode(response.body);是冗余代码,可以直接删掉,后面你已经用allPathLabTestModelFromJson解析响应了,不需要重复解码。
内容的提问来源于stack exchange,提问作者Toujo
相关产品推荐
相关产品推荐

