2
respostas

O contato não está salvando, e na tela de listagem dos eventos ele só exime o Unknou error que foi configuradop

Após concluir as implementações fui fazer os testes mas o evento não é salvo e também não retorna a lista vazia que foi configurado para ser mostrada inicialmente antes de carregar os contatos

Tela do contact_list

import 'package:bytebank/datadase/app_database.dart';
import 'package:bytebank/models/contact.dart';
import 'package:bytebank/screens/contact_form.dart';
import 'package:flutter/material.dart';

class ContactsList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Contacts"),
      ),
      body: FutureBuilder<List<Contact>>(
        initialData: [],
        future: findAll(),
        builder: (context, snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.none:
              // TODO: Handle this case.
              break;
            case ConnectionState.waiting:
              return Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: const [
                    CircularProgressIndicator(),
                    Text("Loading"),
                  ],
                ),
              );
              break;
            case ConnectionState.active:
              // TODO: Handle this case.
              break;
            case ConnectionState.done:
              if (snapshot.hasData) {
                final List<Contact> contacts = snapshot.data as List<Contact>;
                return ListView.builder(
                  itemBuilder: (context, index) {
                    final Contact contact = contacts[index];
                    return _ContactItens(contact);
                  },
                  itemCount: contacts.length,
                );
              }
              // return const Center(
              //   child: Text(
              //     "Nenhum contato encontrado",
              //     style: TextStyle(
              //       fontSize: 24.0,
              //       fontStyle: FontStyle.italic,
              //     ),
              //   ),
              // );
              break;
          }
          return const Padding(
            padding: EdgeInsets.all(16.0),
            child: Text(
              "Unknow Error",
              style: TextStyle(
                fontSize: 24.0,
              ),
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        child: const Icon(Icons.add),
        onPressed: () {
          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (context) => ContactForm(),
            ),
          );
        },
      ),
    );
  }
}

class _ContactItens extends StatelessWidget {
  final Contact contact;
  const _ContactItens(this.contact);

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

Parte de salvamento e busca dos dados

import 'package:bytebank/models/contact.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

Future<Database> createDatabase() {
  return getDatabasesPath().then((dbPath) {
    final String path = join(dbPath, 'bytebank.db');
    return openDatabase(path, onCreate: (db, version) {
      db.execute('CREATE TABLE contracts('
          'Id INTEGER PRIMARY KEY,'
          'name INTEGER,'
          'account_number INTEGER,');
    }, version: 1);
  });
}

Future<int> save(Contact contact) {
  return createDatabase().then((db) {
    final Map<String, dynamic> contactMap = Map();
    contactMap['name'] = contact.name;
    contactMap['account_number'] = contact.accountNumber;
    return db.insert('contacts', contactMap);
  });
}

Future<List<Contact>> findAll() {
  return createDatabase().then((db) {
    return db.query("contacts").then((maps) {
      final List<Contact> contacts = [];
      for (Map<String, dynamic> map in maps) {
        final Contact contact = Contact (
          id: map['id'], 
          name: map['name'], 
          accountNumber: map['account_number']
        );
        contacts.add(contact);
      }
      return contacts;
    });
  });
}
2 respostas

Tela do Formulário

import 'package:bytebank/datadase/app_database.dart';
import 'package:bytebank/models/contact.dart';
import 'package:flutter/material.dart';

class ContactForm extends StatelessWidget {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _accountNumberController =
      TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("New Contact"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _nameController,
              decoration: const InputDecoration(
                labelText: "Full Name",
              ),
              style: const TextStyle(fontSize: 20.0),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 8.0),
              child: TextField(
                controller: _accountNumberController,
                decoration: const InputDecoration(
                  labelText: "Account Number",
                ),
                style: const TextStyle(fontSize: 20.0),
                keyboardType: TextInputType.number,
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(top: 16.0),
              child: SizedBox(
                width: double.maxFinite,
                child: ElevatedButton(
                  child: const Text("Confirm"),
                  onPressed: () {
                    final String name = _nameController.text;
                    final int? accountNumber =
                        int.tryParse(_accountNumberController.text);

                      final Contact newContact = Contact(
                          id: 0, name: name, accountNumber: accountNumber!);
                      save(newContact).then((id) => Navigator.pop(context));
                  },
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}

Oi Breno! Tudo bem?

Desculpe a demora em retornar, vejo que você já finalizou o curso, mas irei responder seu tópico com base no que você nos informou.

Parece que você está enfrentando dois problemas: o evento não está sendo salvo e a lista vazia não está sendo exibida corretamente.

Vamos começar pelo problema do evento não ser salvo. Analisando o código, parece que você está utilizando o método save para salvar o contato no banco de dados. No entanto, notei que há um pequeno erro de digitação na criação da tabela no método createDatabase. A coluna "contracts" está escrita como "contracts" em vez de "contacts". Isso pode estar causando o problema. Sugiro que você corrija essa linha no método createDatabase para que fique assim:

db.execute('CREATE TABLE contacts('
          'Id INTEGER PRIMARY KEY,'
          'name INTEGER,'
          'account_number INTEGER,');

Isso deve resolver o problema do evento não ser salvo corretamente.

Agora, em relação à lista vazia não ser exibida, notei que você comentou o trecho de código que exibe a mensagem "Nenhum contato encontrado". Para corrigir isso, basta remover os comentários desse trecho de código. Ficaria assim:

return const Center(
  child: Text(
    "Nenhum contato encontrado",
    style: TextStyle(
      fontSize: 24.0,
      fontStyle: FontStyle.italic,
    ),
  ),
);

Dessa forma, quando não houver nenhum contato na lista, a mensagem será exibida corretamente.

Espero que essas sugestões possam te ajudar a resolver os problemas que está enfrentando.

Um abraço e bons estudos.

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