1
resposta

Erro de conversão de Future<dynamic> para Future<Transferência>

Olá,

Passei um certo tempo olhando o pq do meu código não funcionava e só depois de tirar foi que minha lista de transações funcionou. Segue os dois códigos abaixo:

O código que não funcionou:

class ListaTransferenciasState extends State<ListaTransferencias>{

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Transferências'),
      ),
      body: ListView.builder(
        itemCount: widget._transferencias.length,
        itemBuilder: (context, indice){
          final transferencia = widget._transferencias[indice];
          return ItemTransferencia(transferencia);
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          final Future<Transferencia?> future = Navigator.push(context, MaterialPageRoute(builder: (context){
            return FormularioTransferencia();
          })) as Future<Transferencia>;
          future.then((transferenciaRecebida){
            if(transferenciaRecebida != null) {
              setState(() => widget._transferencias.add(transferenciaRecebida));
            }
          });
        },
      ),
    );
  }
}

Código que funionou:


class ListaTransferenciasState extends State<ListaTransferencias>{

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Transferências'),
      ),
      body: ListView.builder(
        itemCount: widget._transferencias.length,
        itemBuilder: (context, indice){
          final transferencia = widget._transferencias[indice];
          return ItemTransferencia(transferencia);
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          final Future future = Navigator.push(context, MaterialPageRoute(builder: (context){
            return FormularioTransferencia();
          }));
          future.then((transferenciaRecebida){
            if(transferenciaRecebida != null) {
              setState(() => widget._transferencias.add(transferenciaRecebida));
            }
          });
        },
      ),
    );
  }
}
1 resposta

Olá Luiz,

Pelo que pude entender, você estava tendo um erro de conversão de Future para Future<Transferência>, certo?

Pelo código que você postou, acredito que o problema estava na linha onde você estava fazendo o cast do Future retornado pelo Navigator.push para Future. Na primeira versão do código, você estava fazendo isso:

            return FormularioTransferencia();
          })) as Future<Transferencia>;```

E na segunda versão, você removeu o <Transferencia>, deixando apenas:

```final Future future = Navigator.push(context, MaterialPageRoute(builder: (context){
            return FormularioTransferencia();
          }));```

Isso acontece porque o Navigator.push retorna um Future<dynamic> e, ao tentar fazer o cast para Future<Transferencia>, o Dart acaba gerando um erro. 

Removendo o <Transferencia>, você está deixando o Dart inferir o tipo do Future retornado pelo Navigator.push, que, no caso, é Future<dynamic>. E como você está fazendo a verificação do tipo do objeto retornado no then(), não há problema em não especificar o tipo do Future.

Espero ter ajudado e bons estudos!