Estou acompanhando o curso, mas utilizando a versão 2.5 do flutter, como ficaria esse método nesta versão? estou com dificuldades para consegui uma solução.
Estou acompanhando o curso, mas utilizando a versão 2.5 do flutter, como ficaria esse método nesta versão? estou com dificuldades para consegui uma solução.
Olá, Breno! Tudo bem?
Não tenho certeza do que pode estar errado sem ver os erros, mas acho que um dos problemas pode ser porque você está retornando uma lista (List
) do tipo Contact
, portanto precisa informar isso na declaração da sua função isso, assim:
Future<List<Contact>> findAll() {
//...
}
A função completa acredito que fique assim:
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(
map['id'],
map['name'],
map['account_number'],
);
contacts.add(contact);
}
return contacts;
});
});
}
Outro ponto que talvez esteja te causando o problema pode ser o seu model de Contact
, verifique se ele e seu construtor estão certinhos:
class Contact {
final int id;
final String name;
final int accountNumber;
Contact(this.id, this.name, this.accountNumber);
@override
String toString() {
return 'Contact: $id, $name, $accountNumber';
}
}
Espero que isso te ajude de alguma forma, caso contrário, vamos continuar tentando. Se puder enviar os erros que estão aparecendo, ou se seu projeto estiver no GitHub e puder compartilhar o link seria ótimo.
Bons estudos!
Meu código está assim.
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 = new Map();
contactMap['id'] = contact.id;
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 (
map['id'],
map['name'],
map['account_number'],
);
contacts.add(contact);
}
return contacts;
});
});
}
Acrescentei o List como havia sugerido
class Contact {
final int id;
final String name;
final int accountNumber;
Contact(map, {required this.id, required this.name, required this.accountNumber});
}
E assim estão os erros
Oi, Breno, acho que o problema está na forma como está fazendo o seu construtor, que está diferente. Você já tentou alterar o model de Contact
da forma como mostrei? Assim:
class Contact {
final int id;
final String name;
final int accountNumber;
//Construtor sem map e sem required:
Contact(this.id, this.name, this.accountNumber);
@override
String toString() {
return 'Contact: $id, $name, $accountNumber';
}
}
E outra coisa, se você utilizar required
nas variáveis do construtor, precisa nomear os parâmetros quando for chamá-lo, assim:
final Contact contact = Contact (
id: map['id'],
name: map['name'],
accountNumber: map['account_number'],
);
OBS: Se usar o model que mandei não precisa fazer isso.
Pode tentar corrigir o model e me informar se deu certo?
Deu certo das duas formas. Muito obrigado