【发布时间】:2021-11-04 03:56:18
【问题描述】:
我想解析过去巡航的 json 并在列表视图中显示数据。我在解析时遇到了这个异常。未处理的异常:“CrusieModel”类型不是“Map
我的 API 类
final String baseUrl = "https://yourapilink";
String token = "eyJhbGciOiJIUzM4NCIsImtleSI6MjAxNzA5MjEsImlhdCI6MTYzMDk1MzAzNCiZXhwIjoxNjMxNTU3ODM0LCJpc3MiOiJodHRwOi8vYXBwLWFwaS5mcmVb2xzZW5jcnVpc2VzLmNvbSJ9.eyJSb2xlcyI6WyJNeUNydWlzZSJdLCJab2hvSUQiOiIyOTIxMTwMDAwMDAyODMwODgifQ.OCjwy_Q8mWaJUBWTIzAfUvX4voMDdry_Y_LLj6s8nxt514BVNQk3yptcZFnD48Hd";
Future<CrusieModel> getPastCruise( BuildContext context, String? token) async {
String url = baseUrl + "api/v1/atcore/user?token=$token";
//Utilities.showLoaderDialog(context);
final response = await http.post(Uri.parse(url), headers: {
'Content-Type':'application/json',
'Authorization':'Bearer $token'
});
debugPrint("jsonBody past and future:::: ${response.body}");
print("jsonBody past and future:::: ${response.body}");
print("nntoken::: $token");
print("response Code cruise history:::: ${response.statusCode}");
if(response.statusCode == 200){
//Navigator.pop(context);
// return json.decode(response.body);
return CrusieModel.fromJson(json.decode(response.body));
}else if(response.statusCode == 500){
//Navigator.pop(context);
return Utilities.errorDialog("There was an error getting the information from Atcore or Zoho", context);
}else{
//Navigator.pop(context);
return Utilities.errorDialog("Something went wrong", context);
}
// return data;
}
我的模型类
import 'dart:convert';
CrusieModel crusieModelFromJson(String str) => CrusieModel.fromJson(json.decode(str));
String crusieModelToJson(CrusieModel data) => json.encode(data.toJson());
class CrusieModel {
CrusieModel({
this.pastCruises,
});
List<PastCruise>? pastCruises;
factory CrusieModel.fromJson(Map<String, dynamic> json) => CrusieModel(
pastCruises: List<PastCruise>.from(json["PastCruises"].map((x) => PastCruise.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"PastCruises": List<dynamic>.from(pastCruises!.map((x) => x.toJson())),
};
}
class PastCruise {
PastCruise({
this.cruiseId,
this.name,
this.shortName,
this.departureDate,
this.returnDate,
this.duration,
this.shortDescription,
this.departurePortCode,
this.departurePortName,
this.departurePortNameWithCountry,
this.returnPortCode,
this.returnPortName,
this.returnPortNameWithCountry,
this.shipCode,
this.shipName,
this.cruiseStatus,
this.cruiseStatusApp,
this.cruisingCategory,
this.cruiseCancelledInfo,
this.modifiedDate,
this.isAddOnHoliday,
this.bookingRef,
this.agentName,
this.guests,
});
String? cruiseId;
String? name;
String? shortName;
DateTime? departureDate;
DateTime? returnDate;
int? duration;
String? shortDescription;
String? departurePortCode;
String? departurePortName;
String? departurePortNameWithCountry;
String? returnPortCode;
String? returnPortName;
String? returnPortNameWithCountry;
String? shipCode;
String? shipName;
String? cruiseStatus;
String? cruiseStatusApp;
String? cruisingCategory;
String? cruiseCancelledInfo;
DateTime? modifiedDate;
bool? isAddOnHoliday;
String? bookingRef;
String? agentName;
String? guests;
factory PastCruise.fromJson(Map<String, dynamic> json) => PastCruise(
cruiseId: json["CruiseId"],
name: json["Name"],
shortName: json["ShortName"],
departureDate: DateTime.parse(json["DepartureDate"]),
returnDate: DateTime.parse(json["ReturnDate"]),
duration: json["Duration"],
shortDescription: json["ShortDescription"],
departurePortCode: json["DeparturePortCode"],
departurePortName: json["DeparturePortName"],
departurePortNameWithCountry: json["DeparturePortNameWithCountry"],
returnPortCode: json["ReturnPortCode"],
returnPortName: json["ReturnPortName"],
returnPortNameWithCountry: json["ReturnPortNameWithCountry"],
shipCode: json["ShipCode"],
shipName: json["ShipName"],
cruiseStatus: json["CruiseStatus"],
cruiseStatusApp: json["CruiseStatusApp"],
cruisingCategory: json["CruisingCategory"],
cruiseCancelledInfo: json["CruiseCancelledInfo"],
modifiedDate: DateTime.parse(json["ModifiedDate"]),
isAddOnHoliday: json["IsAddOnHoliday"],
bookingRef: json["BookingRef"],
agentName: json["AgentName"],
guests: json["Guests"],
);
Map<String, dynamic> toJson() => {
"CruiseId": cruiseId,
"Name": name,
"ShortName": shortName,
"DepartureDate": departureDate!.toIso8601String(),
"ReturnDate": returnDate!.toIso8601String(),
"Duration": duration,
"ShortDescription": shortDescription,
"DeparturePortCode": departurePortCode,
"DeparturePortName": departurePortName,
"DeparturePortNameWithCountry": departurePortNameWithCountry,
"ReturnPortCode": returnPortCode,
"ReturnPortName": returnPortName,
"ReturnPortNameWithCountry": returnPortNameWithCountry,
"ShipCode": shipCode,
"ShipName": shipName,
"CruiseStatus": cruiseStatus,
"CruiseStatusApp": cruiseStatusApp,
"CruisingCategory": cruisingCategory,
"CruiseCancelledInfo": cruiseCancelledInfo,
"ModifiedDate": modifiedDate!.toIso8601String(),
"IsAddOnHoliday": isAddOnHoliday,
"BookingRef": bookingRef,
"AgentName": agentName,
"Guests": guests,
};
}
我的列表视图小部件
在itemCount: snapshot.data!.pastCruises!.length,,我将 Null Check 运算符用于空值
Widget listviewWidget(){
return FutureBuilder<CrusieModel>(
future: pastCruises,
builder: (context, snapshot){
log("${snapshot.data}", name: "DATA RECEIVED");
/* if(snapshot.hasData){*/
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data!.pastCruises!.length,
physics: BouncingScrollPhysics(),
itemBuilder: (context, index){
CrusieModel cruiseData = snapshot.data! ;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child:
Stack(
children: [
Image.asset("assets/images/ticket_bg.png",
height: MediaQuery.of(context).size.height*0.35,
width: MediaQuery.of(context).size.width*0.90,
fit: BoxFit.fill,),
Container(
width: MediaQuery.of(context).size.width*0.90,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: MediaQuery.of(context).size.height*0.15,
child: Padding(
padding: const EdgeInsets.only(left: 50, right: 50, top: 30),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Departure", style: TextStyle(fontFamily: 'Montserrat',
color: CustomColors.subtitleText, fontSize: 12),),
Row(
children: [
Text(/*items[index].departureDate*/"25",
style: TextStyle(fontFamily: 'Montserrat', color: CustomColors.madison,
fontWeight: FontWeight.bold, fontSize: 32),),
Column(
children: [
Text(/*items[index].departureDateMonth*/"08",
style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.subtitleText,
fontWeight: FontWeight.bold, fontSize: 12),),
Text(/*items[index].departureDateYear*/"2008",
style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.madison,
fontWeight: FontWeight.bold, fontSize: 12),),
],
),
],
),
],
),
Column(
children: [
Icon(Icons.directions_boat),
Text("${cruiseData.pastCruises?[index].duration ?? ""}", style: TextStyle(fontFamily: 'Montserrat',fontWeight: FontWeight.w700),),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Return', style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.subtitleText, fontSize: 12),),
Row(
children: [
Text(/*items[index].returnDate*/"18",
style: TextStyle(fontFamily: 'Montserrat', color: CustomColors.madison,
fontWeight: FontWeight.bold, fontSize: 32),),
Column(
children: [
Text(/*items[index].returnDateMonth*/"03",
style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.subtitleText,
fontWeight: FontWeight.bold, fontSize: 12),),
Text(/*items[index].returnDateYear*/"2019",
style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.madison,
fontWeight: FontWeight.bold, fontSize: 12),),
],
),
],
),
],
),
],
),
),
),
Padding(
padding: const EdgeInsets.fromLTRB(50, 20, 50, 30),
child: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Passenger", style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.subtitleText, fontSize: 12),),
Text("/*items[index].passengerName*/""amit kumar", style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.madison,
fontWeight: FontWeight.bold),)
],),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Booking Reference", style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.subtitleText, fontSize: 12),),
Text("${cruiseData.pastCruises![index].bookingRef}", style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.madison,
fontWeight: FontWeight.bold),)
],)
],),
SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("TRavel Agency", style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.subtitleText, fontSize: 12),),
Text("${cruiseData.pastCruises![index].agentName}", style: TextStyle(fontFamily: 'Montserrat',color: CustomColors.madison,
fontWeight: FontWeight.bold),)
],),
SizedBox(width: 10,)
],)
],
),
),
)
],
),
)
],
),
);
});
/*}else{
return Center(child: CircularProgressIndicator());
}*/
},
);
}
我不明白这里有什么问题。我只想在列表视图中显示过去的巡航参数。
【问题讨论】:
-
你用 Postman 测试过请求吗?
-
responce.body 是什么?
-
Mhmd Zawi 是的,我已经测试了它的工作原理
-
HasanToufiqAhamed 我要在这里更新响应正文吗?