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;
});
});
}