Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Minha lista não está atualizando o valor. Este código é a cópia do que está na aula. Não entendi o não funcionamento, talvez esteja passando algo batido

import 'package:flutter/material.dart';

void main() => runApp(ByteBankApp());

class ByteBankApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: TransferList(),
      ),
    );
  }
}

class TransferForm extends StatelessWidget {
  final TextEditingController _controlCampNumberAccount =
      TextEditingController();
  final TextEditingController _controlValueCamp = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Criando Transferência'),
        ),
        body: Column(
          children: <Widget>[
            Editor(
              controller: _controlCampNumberAccount,
              label: 'Número da Conta',
              clew: '0000',
            ),
            Editor(
              controller: _controlValueCamp,
              label: 'Valor',
              clew: '0.00',
              icon: Icons.monetization_on,
            ),
            RaisedButton(
              onPressed: () => _createTransfer(context),
              child: Text('Confirmar'),
            ),
          ],
        ));
  }

  void _createTransfer(BuildContext context) {
    final int numberAccount = int.tryParse(_controlCampNumberAccount.text);
    final double value = double.tryParse(_controlValueCamp.text);
    if (numberAccount != null && value != null) {
      final createdTransfer = Transfer(value, numberAccount);
      Navigator.pop(context, createdTransfer);
    }
  }
}

class TransferList extends StatefulWidget {
  final List<Transfer> _transfers = List();

  @override
  State<StatefulWidget> createState() {
    return TransferListState();
  }
}

class TransferListState extends State<TransferList> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Transferências'),
      ),
      body: ListView.builder(
        itemCount: widget._transfers.length,
        itemBuilder: (context, index) {
          final transfer = widget._transfers[index];
          return TransferItem(transfer);
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          final Future<Transfer> future =
              Navigator.push(context, MaterialPageRoute(builder: (context) {
            return TransferForm();
          }));
          future.then((transferReceived) {
            widget._transfers.add(transferReceived);
            debugPrint('$transferReceived');
          });
        },
      ),
    );
  }
}

class TransferItem extends StatelessWidget {
  final Transfer _transferencia;

  TransferItem(this._transferencia);

  @override
  Widget build(BuildContext context) {
    return Card(
        child: ListTile(
      leading: Icon(Icons.monetization_on),
      title: Text(_transferencia.value.toString()),
      subtitle: Text(_transferencia.numberAccount.toString()),
    ));
  }
}

class Editor extends StatelessWidget {
  final TextEditingController controller;
  final String label;
  final String clew;
  final IconData icon;

  Editor({this.controller, this.label, this.clew, this.icon});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: TextField(
        controller: controller,
        style: TextStyle(fontSize: 24.0),
        decoration: InputDecoration(
          icon: icon != null ? Icon(icon) : null,
          labelText: label,
          hintText: clew,
        ),
        keyboardType: TextInputType.number,
      ),
    );
  }
}

class Transfer {
  final double value;
  final int numberAccount;

  Transfer(this.value, this.numberAccount);

  @override
  String toString() {
    return 'Transfer{value: $value, numberAccount: $numberAccount}';
  }
}
1 resposta
solução!

Olá Lucas, tudo bem com você?

Acredito que o instrutor trata disso nessa mesma aula, não?

Acontece que se o nosso build for executado antes de receber a transação de fato, a tela não é atualizada ( na verdade é, porém com a informação antiga), para consertar isso temos que utilizar o setState, da seguinte maneira:

          future.then((transferReceived) {
              setState( () => widget._transfers.add(transferReceived));
          });

Ou seja, o build irá montar a lista com as transferências, quando chegar a nova, pedimos para que ele atualize o estado e refaça a lista, dessa forma irá funcionar corretamente a nossa aplicação :)

Algumas vezes, por sorte, a transferência chega antes de fazer o build e dessa forma temos sem querer a impressão de que tudo está funcionando corretamente, mas neste caso o setState é completamente necessário :)

Abraços e Bons Estudos!