1
resposta

as trasnferencias criadas não estão aparecendo a lista de transferencias

quando crio uma nova transferencia, a mesma não aparece no meu StatefullWidget. segue abaixo meu codigo:

import 'dart:ffi';
import 'package:flutter/material.dart';

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

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

class FormularioTransferencia extends StatelessWidget {
  final TextEditingController _numeroContaController = TextEditingController();
  final TextEditingController _valorController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Criando Transferencia")),
      body: Column(children: [
        Editor(
            controller: _numeroContaController,
            dica: 'Numero da conta',
            rotulo: '0000'),
        Editor(
            controller: _valorController,
            rotulo: "valor transferencia",
            dica: '00,00',
            icone: Icons.monetization_on),
        ElevatedButton(
          onPressed: () => _criaTransferencia(context),
          child: Text('Confirmar'),
        ),
      ]),
    );
  }

  void _criaTransferencia(BuildContext context) {
    final int numeroConta = int.parse(_numeroContaController.text);
    final double valor = double.parse(_valorController.text);
    if (numeroConta != null && valor != null) {
      Transferencia transferenciaCriada = Transferencia(valor, numeroConta);
      Navigator.pop(context, transferenciaCriada);
    }
  }
}

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

  Editor({required this.controller,
    required this.rotulo,
    required this.dica,
    this.icone});

  @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: icone != null ? Icon(icone) : null,
          labelText: rotulo,
          hintText: dica,
        ),
        keyboardType: TextInputType.number,
      ),
    );
  }
}

class ListaTransferencias extends StatefulWidget {
  final List<Transferencia> _transferencias = [];

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

class ListaTransferenciaState extends State<ListaTransferencias> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("transferencias"),
      ),
      body: ListView.builder(
        itemCount: widget._transferencias.length,
        itemBuilder: (context, indice) {
          final transferencia = widget._transferencias[indice];
          return ItemTransferencia(transferencia);
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(context, MaterialPageRoute(builder: (context) {
            return FormularioTransferencia();
          })).then((transferenciaRecebida) {
            debugPrint(transferenciaRecebida.toString());
            widget._transferencias.add(transferenciaRecebida);
            debugPrint(widget._transferencias.toString());
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }

}

class ItemTransferencia extends StatelessWidget {
  final Transferencia transferencia;

  ItemTransferencia(this.transferencia);

  @override
  Widget build(BuildContext context) {
    return Card(
      child: transferencia,
    );
  }
}

class Transferencia extends StatelessWidget {
  final double valor;
  final int numeroConta;

  Transferencia(this.valor, this.numeroConta);

  @override
  Widget build(BuildContext context) {
    return ListTile(
      leading: Icon(Icons.monetization_on),
      title: Text(valor.toString()),
      subtitle: Text(numeroConta.toString()),
    );
  }

  @override
  String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
    // TODO: implement toString
    return ('valor:  $valor conta: $numeroConta');
  }
}
1 resposta

Boa tarde, Ana!

Só ficou faltando usar um setState na hora que você adiciona uma transferencia na lista. Este comando é necessário para atualizar um widget Stateful. Segue o seu código com esta alteração:

import 'package:flutter/material.dart';

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

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

class FormularioTransferencia extends StatelessWidget {
  final TextEditingController _numeroContaController = TextEditingController();
  final TextEditingController _valorController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Criando Transferencia")),
      body: Column(children: [
        Editor(
            controller: _numeroContaController,
            dica: 'Numero da conta',
            rotulo: '0000'),
        Editor(
            controller: _valorController,
            rotulo: "valor transferencia",
            dica: '00,00',
            icone: Icons.monetization_on),
        ElevatedButton(
          onPressed: () => _criaTransferencia(context),
          child: Text('Confirmar'),
        ),
      ]),
    );
  }

  void _criaTransferencia(BuildContext context) {
    final int numeroConta = int.parse(_numeroContaController.text);
    final double valor = double.parse(_valorController.text);
    if (numeroConta != null && valor != null) {
      Transferencia transferenciaCriada = Transferencia(valor, numeroConta);
      Navigator.pop(context, transferenciaCriada);
    }
  }
}

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

  Editor({required this.controller,
    required this.rotulo,
    required this.dica,
    this.icone});

  @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: icone != null ? Icon(icone) : null,
          labelText: rotulo,
          hintText: dica,
        ),
        keyboardType: TextInputType.number,
      ),
    );
  }
}

class ListaTransferencias extends StatefulWidget {
  final List<Transferencia> _transferencias = [];

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

class ListaTransferenciaState extends State<ListaTransferencias> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("transferencias"),
      ),
      body: ListView.builder(
        itemCount: widget._transferencias.length,
        itemBuilder: (context, indice) {
          final transferencia = widget._transferencias[indice];
          return ItemTransferencia(transferencia);
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(context, MaterialPageRoute(builder: (context) {
            return FormularioTransferencia();
          })).then((transferenciaRecebida) {
            setState(() {
              debugPrint(transferenciaRecebida.toString());
            widget._transferencias.add(transferenciaRecebida);
            debugPrint(widget._transferencias.toString());
            });
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }

}

class ItemTransferencia extends StatelessWidget {
  final Transferencia transferencia;

  ItemTransferencia(this.transferencia);

  @override
  Widget build(BuildContext context) {
    return Card(
      child: transferencia,
    );
  }
}

class Transferencia extends StatelessWidget {
  final double valor;
  final int numeroConta;

  Transferencia(this.valor, this.numeroConta);

  @override
  Widget build(BuildContext context) {
    return ListTile(
      leading: Icon(Icons.monetization_on),
      title: Text(valor.toString()),
      subtitle: Text(numeroConta.toString()),
    );
  }

  @override
  String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
    // TODO: implement toString
    return ('valor:  $valor conta: $numeroConta');
  }
}