(Solved) ERROR: Flutter Unhandled Exception: type 'Future<Dynamic>' is not a subtype of type 'List<Oficioenviado>

Asked

Viewed 3,464 times

-1

I’m trying to make an Infinit scroll, I have a consumption of an api where I take the data and convert with my model to json, I want to insert this data in variable, where when arriving at the end of the scroll always add 10 more items, my problem is to insert the data in this variable, I have tried several ways but without success, follow the error print and the code, if anyone can help me thank you.

inserir a descrição da imagem aqui

My Main Class

var oficiosEnviadosData = new List<OficioEnviado>();
  var oficiosEnviados = new List<OficioEnviado>();

  onLoad() async {
    oficiosEnviados = this.listPaginate(_currentPage, _limit);

    oficiosEnviadosData.addAll(oficiosEnviados);
    _currentPage++;
    print(oficiosEnviadosData);
  }

  listPaginate(int page, int perPage) async {
    var token = await LocalShared().getValueShared('token');

    var url =
        'http://10.0.2.2:3333/api/v1/oficio/lista?page=$page&perPage=$perPage';
    var header = {
      "Content-Type": "application/json",
      "Authorization": "Bearer $token"
    };

    var response = await http.get(url, headers: header);

    if (response.statusCode == 200) {
      Iterable decoded = jsonDecode(response.body)["data"];

      List<OficioEnviado> result =
          decoded.map((data) => OficioEnviado.fromJson(data)).toList();

      return result;
    }

    return response;
  }

My Model

class OficioEnviado {
  int idOfEnvio;
  int idDestinatario;
  String lido;
  String pendente;
  int idOficio;
  Oficio oficio;

  OficioEnviado(
      {this.idOfEnvio,
      this.idDestinatario,
      this.lido,
      this.pendente,
      this.idOficio,
      this.oficio});

  OficioEnviado.fromJson(Map<String, dynamic> json) {
    idOfEnvio = json['idOfEnvio'];
    idDestinatario = json['idDestinatario'];
    lido = json['lido'];
    pendente = json['pendente'];
    idOficio = json['idOficio'];
    oficio =
        json['oficio'] != null ? new Oficio.fromJson(json['oficio']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['idOfEnvio'] = this.idOfEnvio;
    data['idDestinatario'] = this.idDestinatario;
    data['lido'] = this.lido;
    data['pendente'] = this.pendente;
    data['idOficio'] = this.idOficio;
    if (this.oficio != null) {
      data['oficio'] = this.oficio.toJson();
    }
    return data;
  }
}

class Oficio {
  int idRemetente;
  int idOficio;
  int idLocalRemetente;
  String numOficio;
  String ano;
  String dataEnvio;
  String horaEnvio;
  String descricao;
  String assunto;
  String texto;
  Remetente remetente;

  Oficio(
      {this.idRemetente,
      this.idOficio,
      this.idLocalRemetente,
      this.numOficio,
      this.ano,
      this.dataEnvio,
      this.horaEnvio,
      this.descricao,
      this.assunto,
      this.texto,
      this.remetente});

  Oficio.fromJson(Map<String, dynamic> json) {
    idRemetente = json['idRemetente'];
    idOficio = json['idOficio'];
    idLocalRemetente = json['idLocalRemetente'];
    numOficio = json['numOficio'];
    ano = json['ano'];
    dataEnvio = json['dataEnvio'];
    horaEnvio = json['horaEnvio'];
    descricao = json['descricao'];
    assunto = json['assunto'];
    texto = json['texto'];
    remetente = json['remetente'] != null
        ? new Remetente.fromJson(json['remetente'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['idRemetente'] = this.idRemetente;
    data['idOficio'] = this.idOficio;
    data['idLocalRemetente'] = this.idLocalRemetente;
    data['numOficio'] = this.numOficio;
    data['ano'] = this.ano;
    data['dataEnvio'] = this.dataEnvio;
    data['horaEnvio'] = this.horaEnvio;
    data['descricao'] = this.descricao;
    data['assunto'] = this.assunto;
    data['texto'] = this.texto;
    if (this.remetente != null) {
      data['remetente'] = this.remetente.toJson();
    }
    return data;
  }
}

class Remetente {
  int idUsuario;
  String cpf;
  String senha;
  String email;
  String nome;

  Remetente({this.idUsuario, this.cpf, this.senha, this.email, this.nome});

  Remetente.fromJson(Map<String, dynamic> json) {
    idUsuario = json['id_usuario'];
    cpf = json['cpf'];
    senha = json['senha'];
    email = json['email'];
    nome = json['nome'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id_usuario'] = this.idUsuario;
    data['cpf'] = this.cpf;
    data['senha'] = this.senha;
    data['email'] = this.email;
    data['nome'] = this.nome;
    return data;
  }
}
  • The problem is that you are inserting data of one type into a variable of another type. List<OficioEnviado> result =&#xA; decoded.map((data) => OficioEnviado.fromJson(data)).toList(); I believe the problem may be in this line here. Tried to debug and check what is receiving return method decoded.map? Try to change the List<OficioEnviado> for var and see the result.

1 answer

2


Your method listPaginate() is asynchronous and does not have a typed return, the problem is this...

Make the following modification:

  List<OficioEnviado> listPaginate(int page, int perPage) async {
    var token = await LocalShared().getValueShared('token');

    var url =
        'http://10.0.2.2:3333/api/v1/oficio/lista?page=$page&perPage=$perPage';
    var header = {
      "Content-Type": "application/json",
      "Authorization": "Bearer $token"
    };

    var response = await http.get(url, headers: header);

    if (response.statusCode == 200) {
      Iterable decoded = jsonDecode(response.body)["data"];

      List<OficioEnviado> result =
          decoded.map((data) => OficioEnviado.fromJson(data)).toList();

      return result;
    }

    return response;
  }

When you will receive a method async you need to use the await when using your return synchronously, then change the call to:

  onLoad() async {
    oficiosEnviados = await this.listPaginate(_currentPage, _limit);

    oficiosEnviadosData.addAll(oficiosEnviados);
    _currentPage++;
    print(oficiosEnviadosData);
  }

Making these two little changes your code will work

Browser other questions tagged

You are not signed in. Login or sign up in order to post.