【发布时间】:2021-11-05 09:36:22
【问题描述】:
试图在下拉列表中显示我的数据,它显示 type 'List<dynamic>' is not a subtype of type List<DropdownMenuItem<Partner>>? 相信它期待 List<DropdownMenuItem<Partner>> 但它得到 List<dynamic> 。这将是什么语法?我尝试了不同的方法,至少我可以理解。
我的 API 函数
Future<List<Partner>> AllPathLab() async {
var jsonResponse;
var response = await http.post(Uri.parse("http://apiURLTYYYTY"),
body: ({
}));
if (response.statusCode == 200) {
jsonDecode(response.body);
jsonResponse = json.decode(response.body.toString());
print(jsonResponse);
AllPathLabTestModel dataModel = allPathLabTestModelFromJson(response.body);
print(dataModel.partner.length);
for (final item in dataModel.partner)
print(item.partnerName);
List<Partner> arrData = dataModel.partner; // this "partner" is actual json array of data[]
return arrData;
} else {
print("Wrong URL");
throw Exception("Faild to fetch");
}
}
然后尝试在 DropdownMenuItem 中显示。
Container(
child: FutureBuilder<List<Partner>>(
future: AllPathLab(),
builder:
(BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState !=ConnectionState.done) {
return CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text("Somthing went wrong");
}
if (snapshot.hasData) {
return DropdownButton<Partner>(
dropdownColor: Colors.white,
underline: SizedBox(),
isExpanded: true,
items: snapshot.data.map((Partner data) =>
DropdownMenuItem<Partner>(
child: Text("${data.partnerName}"),
value: data,
)
).toList(),
onChanged: (value){
});
}
return Text("Waiting for Internet Connection");
},
),
),
我的模型课
class AllPathLabTestModel {
AllPathLabTestModel({
required this.status,
required this.message,
required this.partner,
});
String status;
String message;
List<Partner> partner;
factory AllPathLabTestModel.fromJson(Map<String, dynamic> json) => AllPathLabTestModel(
status: json["Status"],
message: json["Message"],
partner: List<Partner>.from(json["Partner"].map((x) => Partner.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"Status": status,
"Message": message,
"Partner": List<dynamic>.from(partner.map((x) => x.toJson())),
};
}
class Partner {
Partner({
required this.encPartnerId,
required this.partnerName,
});
String encPartnerId;
String partnerName;
factory Partner.fromJson(Map<String, dynamic> json) => Partner(
encPartnerId: json["EncPartnerId"],
partnerName: json["PartnerName"] == null ? null : json["PartnerName"],
);
Map<String, dynamic> toJson() => {
"EncPartnerId": encPartnerId,
"PartnerName": partnerName == null ? null : partnerName,
};
}
【问题讨论】:
-
尝试通过以下方式进行投射:DropdownMenuItem
(child: Text("${data.partnerName}"), value: data, )).toList().cast >( ) -
哇..终于!!!它的工作,但选择项目后它不显示选定的项目名称。为什么 ?有什么建议吗?
-
是的,这是因为你没有设置一个值......你应该这样做: return DropdownButton
( value: _val,... onChanged: (value){ setState ({_val=value;}) }); -
所以你必须创建一个传递给下拉列表的变量......在我的例子中我称之为_val