3
respostas

Após a transformação de Stless para Stfull o programa não está mostrando os itens da lista.

Fiz varios testes mostrando varios debugPrints em lugares específicos e cheguei no resultado de que:

  • Está retornando a transferencia (e não acho que aí tenha problema)
  • Está entrando no future.then() e aí dentro coloquei pra me mostrar o tamanha do widget._transferencias.length e está dando certo, mostra que vai crescendo, tambem fiz o teste se os valores estão corretos e também estão.

Resumindo está puxando para a lista as transferencias do jeito certo, o problema acredito que esteja no ListView.builder(), dentro do itemBuilder: (context, indice) { Aqui dentro }, coloquei um debugPrint simples que me retorna uma string ("entrou no itemBuilder") e ela só aparece uma vez pois eu criei manualmente uma transferencia e coloquei dentro da lista (é visto no código), quando crio no app outras transferencias da para ver a lista crescendo mas nada é mostrado além da primeira e não entra mais nesse itemBuilder pois não aparece a string mencionada. Segue o código onde eu acho que está o problema (não estou conseguindo deixar ele formatado certinho, mas de todo jeito eu também baixei o código dado em aulas, copiei ele pro meu main, acertei alguns problemas com a nova versão do dart e o SaftyNull e rodei e estava dando o mesmo problema):

class ListaTransferencias extends StatefulWidget { final List _transferencia = [];

@override State createState() { // TODO: implement createState return ListaTransferenciasState(); } }

class ListaTransferenciasState extends State { @override Widget build(BuildContext context) { // TODO: implement build widget.transferencia.add(Transferencia(100.0, 200)); return Scaffold( body: ListView.builder( itemCount: widget.transferencia.length, itemBuilder: (context,indice) { indice = widget.transferencia.length - 1; debugPrint("Entrou no itemBuilder"); final transferencia = widget.transferencia[indice]; return ItemTransferencia(transferencia); }, ), floatingActionButton: FloatingActionButton( onPressed: () { final Future<Transferencia?> future = Navigator.push(context, MaterialPageRoute(builder: (context) { return FormularioTransferencia(); })); future.then((transferenciaRecebida) { if (transferenciaRecebida != null) { widget.transferencia.add(transferenciaRecebida); debugPrint('${widget.transferencia.length}'); } }); }, child: Icon(Icons.add), ), appBar: AppBar( title: Text('Transferencias'), ), ); } }

3 respostas

Acabei de ver a aula de resolução de bugs e lá estava a resposta à minha pergunta. Acho importante na aula em que se faz a troca de Stateless para Statefull o professor comentar sobre esse bug de atualização de tela, pois fiquei um tempo batendo cabeça para ver o que era e pensei em até parar de assistir os videos até encontrar o problema.

Boa noite Dariel. O mesmo aconteceu comigo aqui, estou quebrando a cabeça e só agora lendo sua resposta prosseguirei para a aula de correção de bugs e descobrirei a solução do problema. Realmente não ficou legal assim.

É necessário colocar o setState() no future.then para atualizar. O do professor funcionava sem ele, mas deve ser questão de versão, talvez. De toda maneira, na aula de correção de bugs, como os colegas falaram, o professor comenta a respeito.

Para conhecimento, meu código ficou assim

class TransferListState extends State<TransferList>{

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Transferências'),
      ),
      body: ListView.builder(
        itemCount: widget._transferList.length,
        itemBuilder: (context, position) {
          return TransferItem(widget._transferList[position]);
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          final Future future =
          Navigator.push(context, MaterialPageRoute(builder: (context) {
            return TransferForm();
          }));
          future.then((receiveTransfer) {
            debugPrint('chegou no then do future');
            debugPrint('$receiveTransfer');
            if(receiveTransfer != null){
              setState(() {
                widget._transferList.add(receiveTransfer);
              });
            }
          });
        },
      ),
    );
  }
}