Home > Net >  Flutter Fetch API
Flutter Fetch API

Time:12-01

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?

CodePudding user response:

Your problem is accessing the data, to do that, simply access using:

response.data['USDBRL']

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 the data attribute of the response object.

CodePudding user response:

if(apidata['error']) this is causing the error becsuse apidata['error'] is null and can't be used as bool

    if(response.statusCode == 200){
        error = false;
        errmsg  = '';
      }
    

and you can access data with

 apidata['USDBRL']
  • Related