Tried almost every solution. No luck 🙁
Future<List<ProductModel>> getProducts() async {
try {
final response = await apiService.sendRequest.get('/product');
if (response.data != null) {
print("Data == $response");
return response.data
.map((e) => ProductModel.fromJson(e.toMap())) // error is thrown here
.toList();
}
return <ProductModel>[];
} catch (ex) {
// return <ProductModel>[];
rethrow;
}
}
response is:
{
"status": "SUCCESS",
"message": "Records found",
"data": [
{
"_id": "634acde1a556b0cd25dfffb1",
"typeOfProduct": "Cake",
"name": "Designer Cake",
"primaryPrice": 700,
"primaryDiscountedPrice": 560,
"secondaryPrice": 1400,
"secondaryDiscountedPrice": 1120,
"categories": [
....
],
"tags": [
...
],
"description": "This is the best cake ",
"images": [
...
],
"quantity": "1 Box",
"__v": 0,
"primaryDiscountedRate": 20,
"secondaryDiscountedRate": 20
},
]
}
Product Model is :
class ProductModel {
ProductModel({
required this.id,
required this.typeOfProduct,
required this.name,
required this.primaryPrice,
this.primaryDiscountedPrice,
this.secondaryPrice,
this.secondaryDiscountedPrice,
required this.categories,
required this.tags,
this.description,
required this.images,
this.quantity,
this.primaryDiscountedRate,
this.secondaryDiscountedRate,
});
ObjectId id;
String typeOfProduct;
String name;
int primaryPrice;
int? primaryDiscountedPrice;
int? secondaryPrice;
int? secondaryDiscountedPrice;
List<String> categories;
List<String> tags;
String? description;
List<Image> images;
String? quantity;
int? primaryDiscountedRate;
int? secondaryDiscountedRate;
factory ProductModel.fromJson(Map<String, dynamic> json) => ProductModel(
id: json["_id"],
typeOfProduct: json["typeOfProduct"],
name: json["name"],
primaryPrice: (json["primaryPrice"]),
primaryDiscountedPrice: (json["primaryDiscountedPrice"]),
secondaryPrice: (json["secondaryPrice"]),
secondaryDiscountedPrice: (json["secondaryDiscountedPrice"]),
categories: List<String>.from(json["categories"].map((x) => x)),
tags: List<String>.from(json["tags"].map((x) => x)),
description: json["description"],
images: List<Image>.from(json["images"].map((x) => Image.fromJson(x))),
quantity: json["quantity"],
primaryDiscountedRate: (json["primaryDiscountedRate"]) != null
? json['primaryDiscountedRate'].toInt()
: null,
secondaryDiscountedRate: (json["secondaryDiscountedRate"]) != null
? json["secondaryDiscountedRate"].toInt()
: null,
);
2
Answers
The mistake was
response.data
had the following structureAccesing
response.data
wouldn't take me directly to data , so i had to access usingresponse.data['data']
this solved my problemFinal code:
you’re trying to call
toMap()
on aMap
type, which usually will throw an error because theMap
doesn’t have this method.The error is not thrown for you until you run your code because your data is coming from your external resource.
If you try separately this:
In your case, you should simply cast the elements in your
response.data
to an actualMap
, like this: