2
respostas

Erro ao abrir a tela de transferencias:

Ao tentar abrir a tela de transferências é apresentado o erro abaixo:

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

2 respostas

O meu codigo da lista de transferencias esta assim:

class ContactsList extends StatefulWidget {
  @override
  _ContactsListState createState() => _ContactsListState();
}

class _ContactsListState extends State<ContactsList> {
  final ContactDao _dao = ContactDao();
  final List<Contact> contacts = [];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Transfer'),
      ),
      body: FutureBuilder<List<Contact>>(
        initialData: this.contacts,
        future: _dao.findAll(),
        builder: (context, snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
              break;
            case ConnectionState.waiting:
              return Progress();
              break;
            case ConnectionState.active:
              break;
            case ConnectionState.done:
              final List<Contact>? contacts = snapshot.data;
              return ListView.builder(
                itemBuilder: (context, index) {
                  final Contact? contact = contacts![index];                  return _ContactItem(
                    contact!,
                    onClick: () {
                      Navigator.of(context).push(
                        MaterialPageRoute(
                          builder: (context) => TransactionForm(contact),
                        ),
                      );
                    },
                  );
                },
                itemCount: contacts?.length,
              );
              break;
          }
          return Text('Unknown error');
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (context) => ContactForm(),
            ),
          ).then((value) => setState(() {}));
        },
        child: Icon(
          Icons.add,
        ),
      ),
    );
  }
}

class _ContactItem extends StatelessWidget {
  final Contact contact;
  final Function onClick;

  _ContactItem(
    this.contact, {
    required this.onClick,
  });

  @override
  Widget build(BuildContext context) {
    return Card(
      child: ListTile(
        onTap: () => onClick(),
        title: Text(
          contact.name,
          style: TextStyle(
            fontSize: 24.0,
          ),
        ),
        subtitle: Text(
          contact.accountNumber.toString(),
          style: TextStyle(
            fontSize: 16.0,
          ),
        ),
      ),
    );
  }
}

Seu código está quase lá, mas tá dando um erro chato quando você tenta abrir a tela de transferências, né? Esse "Unexpected null value." geralmente aparece quando tentamos acessar algo que tá como nulo.

Vamos dar uma olhada:

  1. Inicialização da lista de contatos: No início do _ContactsListState, você tá começando a lista contacts com final List<Contact> contacts = [];, certo? Confirma se isso tá tudo certinho para evitar problemas.

  2. Acessando os contatos: Dentro do FutureBuilder, você tá acessando os contatos com contacts![index]. Isso tá certo se contacts não for nulo, mas garante que contacts não tá nulo antes de tentar acessar.

    final Contact? contact = contacts![index];
    

    Só confirma se contacts não é nulo antes de tentar mexer nele.

  3. Tratando o FutureBuilder: Quando usa o FutureBuilder, você já especifica initialData: this.contacts, o que significa que a lista inicial é this.contacts. Checa se essa lista não tá nula desde o começo e se ela tá sendo atualizada direito depois que a operação assíncrona é feita.

    initialData: this.contacts,
    

Arruma essas coisinhas de inicialização nula ou acesso estranho à lista contacts. Isso deve resolver o problema do "Unexpected null value".

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