Estoy accediendo a una respuesta JSON con la siguiente estructura.
{
"fullName": "FirstName LastName",
"listings": "5",
"items": [{
"type": "A",
"id": "xi0823109y",
"imgUrl": "imageurl.com/logo/png",
"addressListings": [{
"type": "residential",
"amount": "790909"
},
{
"type": "commerical",
"amount": "9808212"
}
]
}]
}
Puedo mostrar todos los datos en mi ListView, excepto en ciertas condiciones en las que addressListings puede tener 1 o 2 objetos, lo que significa que puede tener tanto Residencial como Comercial y solo quiero el valor por cantidad. Tengo problemas para poner una condición para verificar si alguno de los artículos está presente, siempre hay 1 artículo (residencial o comercial). Cuando trato de hacer una verificación nula, me da un error de rango.
Aquí está mi modelo
class CusomerDetails {
final String fullName;
final String listings;
final String type;
final String imgUrl;
final String id;
final String? amount;
CusomerDetails({
required this.fullName,
required this.listings,
required this.type,
required this.imgUrl,
required this.id,
this.amount,
});
}
Esta es la función en la que estoy tratando de obtener los datos y pasarlos al generador ListView
Class GetCustomerData{
Future<List<CustomerDetails>> fetchData(queryStr) async {
try{
var response = await http.get(Uri,parse(apiurl+queryStr);
if(reponse.statusCode == 200){
return _parseResponse(response.body);
}else{
print('someError'}
}
on TimeoutException catch (_) {
print('Timeout Error');
}
throw {};
}
}
List<CustomerDetails> _parseResponse(String jsonObj){
final jsonMapObj = jsonDecode(jsonObj);
final list = (jsonMapObj['items'] as list);
var obj = list.map((map)=> CustomerDetails)(
id:map['id'],
fullname:map['fullName'],
type:map['type'],
imgUrl:map[imgUrl],
amount:map['addressListings']['0']?['amount']?? 'Not Available',
// amount1:map['addressListings']['1']?['amount']?? 'Not Available' // tried this way out but didn't work so commented for now.
)).toList()
return obj;
}
}
Por último, si la cantidad no está presente, estoy tratando de pasar "No disponible", sin embargo, todavía tengo que llegar a eso, debido al error de rango.
Solución del problema
Class GetCustomerData{
Future<List<CustomerDetails>> fetchData(queryStr) async {
try{
var response = await http.get(Uri,parse(apiurl+queryStr);
if(reponse.statusCode == 200){
return _parseResponse(response.body);
}else{
print('someError'}
}
on TimeoutException catch (_) {
print('Timeout Error');
}
throw {};
}
}
List<CustomerDetails> _parseResponse(String jsonObj){
final jsonMapObj = jsonDecode(jsonObj);
final list = (jsonMapObj['items'] as list);
var obj = list.map((map)=> CustomerDetails)(
id:map['id'],
fullname:map['fullName'],
type:map['type'],
imgUrl:map[imgUrl],
amount:map['addressListings'].length<1?'Not Available':map['addressListings']['0']['amount']?? 'Not Available',
amount1:map['addressListings'].length<2? 'Not Available':map['addressListings']['1']['amount']?? 'Not Available' // tried this way out but didn't work so commented for now.
)).toList()
return obj;
}
}