Im trying to fetch data from external api, but my screen show this error message:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'bool'
My Screen code is this:
class PricesScreen extends StatefulWidget {
const PricesScreen({super.key});
@override
State<PricesScreen> createState() => _PricesScreenState();
}
class _PricesScreenState extends State<PricesScreen> {
late Response response;
Dio dio = Dio();
var apidata;
bool error = false; //for error status
bool loading = false; //for data featching status
String errmsg = "";
getData() async {
String baseUrl = "https://economia.awesomeapi.com.br/last/USD-BRL";
Response response = await dio.get(baseUrl);
apidata = response.data;
print(response);
if(response.statusCode == 200){
if(apidata["error"]){
error = true;
errmsg = apidata["msg"];
}
}else{
error = true;
errmsg = "Error while fetching data.";
}
}
@override
void initState() {
getData(); //fetching data
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(8),
child: loading?
const CircularProgressIndicator() :
Container(
child:error?Text("Error: $errmsg"):
Column(
children:apidata["data"].map<Widget>((coin){
return CurrencyContainer(
name: coin["name"],
increase: coin["varBid"],
symbol: coin["code"],
value: coin["high"]
);
}).toList(),
)
)
);
}
}
My print message show the data from api:
{"USDBRL":{"code":"USD","codein":"BRL","name":"Dólar Americano/Real Brasileiro","high":"5.1856","low":"5.1856","varBid":"0.0004","pctChange":"0.01","bid":"5.1851","ask":"5.186","timestamp":"1669850610","create_date":"2022-11-30 20:23:30"}}
I tried to access data as ‘apidata = response["USDBRL"]’ but it show error: lib/screens/prices.dart:27:23: Error: The operator ‘[]’ isn’t defined for the class ‘Response’.
- ‘Response’ is from ‘package:dio/src/response.dart’ (‘../../snap/flutter/common/flutter/.pub-cache/hosted/pub.dartlang.org/dio-4.0.6/lib/src/response.dart’).
Try correcting the operator to an existing operator, or defining a ‘[]’ operator.
apidata = response["USDBRL"];
How can i show the data in screen?
2
Answers
Your problem is accessing the data, to do that, simply access using:
You got the error because you are trying to access the
USDBRL
from the response object itself. The data returned from the api should be inside thedata
attribute of the response object.if(apidata['error'])
this is causing the error becsuseapidata['error']
is null and can’t be used as booland you can access data with