Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Como ler arquivo JSON ?

Boa tarde,

ja tentei diversas forma ler e apresentar os dados desse JSON (https://covid19-brazil-api.vercel.app/api/report/v1) , porem me deparo com o erro:

Restarted application in 988ms.
I/flutter (27143):  type '(dynamic) => void' is not a subtype of type '(String, dynamic) => void' of 'f' = Error ao carregar lista TRY
E/flutter (27143): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: Null check operator used on a null value
E/flutter (27143): #0      _HomeCovidState.initState.<anonymous closure>
package:api/main.dart:67
E/flutter (27143): #1      _rootRunUnary (dart:async/zone.dart:1436:47)
E/flutter (27143): #2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter (27143): <asynchronous suspension>
E/flutter (27143):

Segue meu codigo:

Main.dart

import 'package:api/screens/Covid.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: HomeCovid(),
  ));
  // findAll();
}

class HomeCovid extends StatefulWidget {
  @override
  _HomeCovidState createState() => _HomeCovidState();
}

class _HomeCovidState extends State<HomeCovid> {
  late List<Covid> _covid;
  Future<List<Covid>?> _getDadosCovid() async {
    try {
      List<Covid> listCovid = [];

      final response = await http.get(
          Uri.parse('https://covid19-brazil-api.vercel.app/api/report/v1'));

      if (response.statusCode == 200) {
        var decodificaJsonParaObjeto = jsonDecode(response.body);

        decodificaJsonParaObjeto
            .forEach((item) => listCovid.add(Covid.fromJson(item)));

        return listCovid;
      } else {
        print('Error ao carregar lista');
        return null;
      }
    } catch (e) {
      print(' $e = Error ao carregar lista TRY');
      return null;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Text('teste');
  }

  @override
  void initState() {
    super.initState();
    _getDadosCovid().then((map) {
      _covid = map!;
      print(_covid.length);
    });
  }
}

Covid.dart

class Covid {
  late List<Data> data;

  Covid({
    required this.data,
  });

  Covid.fromJson(Map<String, dynamic> json) {
    if (json['data'] != null) {
      List<Data> data = [];
      json['data'].forEach((v) {
        data.add(new Data.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.data != null) {
      data['data'] = this.data.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

class Data {
  int? uid;
  String? uf;
  String? state;
  int? cases;
  int? deaths;
  int? suspects;
  int? refuses;
  String? datetime;

  Data({
    this.uid,
    this.uf,
    this.state,
    this.cases,
    this.deaths,
    this.suspects,
    this.refuses,
    this.datetime,
  });

  Data.fromJson(Map<String, dynamic> json) {
    uid = json['uid'];
    uf = json['uf'];
    state = json['state'];
    cases = json['cases'];
    deaths = json['deaths'];
    suspects = json['suspects'];
    refuses = json['refuses'];
    datetime = json['datetime'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['uid'] = this.uid;
    data['uf'] = this.uf;
    data['state'] = this.state;
    data['cases'] = this.cases;
    data['deaths'] = this.deaths;
    data['suspects'] = this.suspects;
    data['refuses'] = this.refuses;
    data['datetime'] = this.datetime;
    return data;
  }
}
2 respostas
solução!

Fala Ari, tudo bom?

O problema está nessa linha:

decodificaJsonParaObjeto.forEach((item) => listCovid.add(Covid.fromJson(item)));

O que está acontecendo é que você está tentando iterar direto no objeto convertido do response.body, mas ele não é uma lista ainda, ele é um Map que contém uma única chave, que é data, e o valor dessa chave, aí sim é uma lista. Então para resolver isso basta transformar nessa linha chamando a chave:

decodificaJsonParaObjeto["data"].forEach((item) => listCovid.add(Covid.fromJson(item)));

Agora deve funcionar! Uma dica que eu uso muito é usar sites como esse, ou esse para estudar a estrutura do JSON.

Espero que funcione, e qualquer dúvida estamos aí!

Muito Obrigado Ricardo!

connsesgui entender o erro.