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

Meu app não está aparecendo a nova transferência


import 'package:flutter/material.dart';

void main() => runApp(const BytebankApp());

class BytebankApp extends StatelessWidget {
  const BytebankApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: ListaTransferencias(),
      ),
    );
  }
}

class FormularioTransferencia extends StatefulWidget {
  const FormularioTransferencia({Key? key}) : super(key: key);

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

class FormularioTransferenciaState extends State<FormularioTransferencia> {
  final TextEditingController _controladorCampoNumeroConta =
      TextEditingController();
  final TextEditingController _controladorCampoValor = TextEditingController();

  @override
  Widget build(BuildContext context) {
    final ButtonStyle style =
        ElevatedButton.styleFrom(textStyle: const TextStyle(fontSize: 20));

    return Scaffold(
      appBar: AppBar(
        title: const Text('Criando Transferência'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            Editor(
              controlador: _controladorCampoNumeroConta,
              dica: '0000',
              rotulo: 'Numero da conta',
              icone: null,
            ),
            Editor(
              controlador: _controladorCampoValor,
              dica: '0.00',
              rotulo: 'valor',
              icone: Icons.monetization_on,
            ),
            ElevatedButton(
              // ignore: sort_child_properties_last
              child: const Text('Confirmar'),
              style: style,
              onPressed: () => _criaTransferencia(_controladorCampoValor,
                  _controladorCampoNumeroConta, context),
            ),
          ],
        ),
      ),
    );
  }

  void _criaTransferencia(_controladorCampoValor, _controladorCampoNumeroConta,
      BuildContext context) {
    final int? numeroConta = int.tryParse(_controladorCampoNumeroConta.text);
    final double? valor = double.tryParse(_controladorCampoValor.text);
    if (numeroConta != null && valor != null) {
      final transferenciaCriada = Transferencia(valor, numeroConta);
      debugPrint('Criando transferencia');
      debugPrint('$transferenciaCriada');
      Navigator.pop(context, transferenciaCriada);
    }
  }
}

class Editor extends StatelessWidget {
  final TextEditingController controlador;
  final String rotulo;
  final String dica;
  final IconData? icone;

  const Editor({
    Key? key,
    required this.controlador,
    required this.rotulo,
    required this.dica,
    required this.icone,
  }) : super(key: key);

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

class ListaTransferencias extends StatefulWidget {
  ListaTransferencias({Key? key}) : super(key: key);

  final List<Transferencia> _transferencias = List.empty();

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

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(
        onPressed: () {
          final Future<Transferencia?> future =
              Navigator.push(context, MaterialPageRoute(builder: (context) {
            return const FormularioTransferencia();
          }));
          future.then((transferenciaRecebida) {
            Future.delayed(const Duration(seconds: 1), () {
              debugPrint('chegou no then do future');
              debugPrint('$transferenciaRecebida');
              if (transferenciaRecebida != null) {
                setState(() {
                  widget._transferencias.add(transferenciaRecebida);
                });
              }
            });
          });
        },
        child: const Icon(Icons.add),
      ),
    );
  }
}
5 respostas

Boa tarde Diego, meu querido vou pedir pra você me mandar o print do console quando você adiciona uma nova tarefa, pode ser?

Pois quando você cria a tarefa, ele pode não estar recarregando a página ou não salvando a nova tarefa na lista, e com o console poderemos ver qual o problema!

Só pelo código não estou conseguindo captar :P

Segue o erro do console. E o github já está atualizado.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Boa tarde, tudo bem? Estou enfrentando o mesmo problema que o Diego.

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

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

class TransferForm extends StatelessWidget {
  final TextEditingController _controllerTextFieldAccountNumber =
      TextEditingController();
  final TextEditingController _controllerTextFieldValue =
      TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Criando Transferência'),
        ),
        body: Column(
          children: [
            Editor(
                controller: _controllerTextFieldAccountNumber,
                label: 'Número da conta',
                hint: '000'),
            Editor(
                controller: _controllerTextFieldValue,
                label: 'Valor',
                hint: '0.00',
                icon: Icons.monetization_on),
            ElevatedButton(
              onPressed: () => _createTransfer(
                  _controllerTextFieldAccountNumber,
                  _controllerTextFieldValue,
                  context),
              child: Text('Confirmar'),
            )
          ],
        ));
  }
}

void _createTransfer(TextEditingController _controllerTextFieldAccountNumber,
    TextEditingController _controllerTextFieldValue, BuildContext context) {
  final int accountNumber = int.parse(_controllerTextFieldAccountNumber.text);
  final double value = double.parse(_controllerTextFieldValue.text);
  final createdTransfer = Transfer(value, accountNumber);
  debugPrint('Criando Transferência');
  debugPrint('$createdTransfer');
  Navigator.pop(context, createdTransfer);
}

class Editor extends StatelessWidget {
  Editor(
      {required this.controller,
      required this.label,
      required this.hint,
      this.icon});
  final TextEditingController controller;
  final String label;
  final String hint;
  final IconData? icon;
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(8.0),
      child: TextField(
        controller: controller,
        style: TextStyle(
          fontSize: 16.0,
        ),
        decoration: InputDecoration(
          alignLabelWithHint: true,
          labelText: label,
          hintText: hint,
          icon: icon != null ? Icon(icon) : null,
        ),
        keyboardType: TextInputType.number,
      ),
    );
  }
}

class TransfersList extends StatefulWidget {
  final List<Transfer> _transfers = [];

  @override
  State<StatefulWidget> createState() => _TransferListState();
}

class _TransferListState extends State<TransfersList> {
  @override
  Widget build(BuildContext context) {
    widget._transfers.add(Transfer(1001, 10000));
    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(
        onPressed: () {
          final Future future =
              Navigator.push(context, MaterialPageRoute(builder: (context) {
            return TransferForm();
          }));
          future.then((receivedTransfer) {
            debugPrint('chegou no then do future');
            debugPrint('$receivedTransfer');
            widget._transfers.add(receivedTransfer);
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

class TransferItem extends StatelessWidget {
  final Transfer _transfer;

  TransferItem(this._transfer);

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

class Transfer {
  final double value;
  final int accountNumber;

  Transfer(this.value, this.accountNumber);

  @override
  String toString() {
    return 'Transfer{value: $value, accountNumber: $accountNumber}';
  }
}

Segue o conteúdo do console:

Print do console

Acabei de encontrar a resposta.

Não sei como na aula funciona, imagino que é pela versão antiga do Flutter, mas o código:

widget._transfers.add(receivedTransfer);

Deve ficar assim:

setState(() {
              widget._transfers.add(receivedTransfer);
            });

Parece que isso é ensinado na aula seguinte, mas quebra bastante o fluxo de aprendizado, já que a aula seguinte é para evitar bugs, e isso sequer funciona atualmente.

Valeu, espero ter ajudado.

solução!

Oi DIego, pelo seu erro ele está dizendo que sua lista de transferências não possui um tamanho variável, portanto ele nao pode adicionar nenhum objeto nela usando o método .add

Logo sugiro que nessa linha: final List<Transferencia> _transferencias = List.empty(); Você altere para que ela aceite o growable : final List<Transferencia> transferencias = List.empty(growable: true);

Assim você não terá o mesmo problema c:

Espero ter ajudado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software