Então galera, espero que ajude quem está querendo implementar a parte de ID. Com certeza tem outras maneiras de fazer, mas essa até que é bem simples.
A criação do db ficaria assim:
static const String tableSql = 'CREATE TABLE $_tablename('
'$_id INTEGER PRIMARY KEY, '
'$_nome TEXT, '
'$_prioridade INTEGER, '
'$_image TEXT)';
static const String _tablename = 'tasTable';
static const String _id = 'id';
static const String _nome = 'nome';
static const String _prioridade = 'prioridade';
static const String _image = 'image';
save, findAll, find, delete e toMap não tem alteração, mas o toList tem.
List<Task> toList(List<Map<String, dynamic>> listaDeTarefas) {
final List<Task> tarefas = [];
for (Map<String, dynamic> linha in listaDeTarefas) {
final Task tarefa = Task(
linha[_id],
linha[_nome],
linha[_image],
linha[_prioridade],
);
tarefas.add(tarefa);
}
return tarefas;
}
Agora a parte nova, para pegar o ID automaticamente eu criei um método dentro do TaskDao. Ele verifica o tamanho do banco de dados, se for vazio ele irá retornar uma variável com valor 1, para iniciar o banco, se o valor não for zero, ele vai retornar uma variável tamanho do banco + 1.
Future<int> pegarTamanhoDB() async {
final Database bancoDeDados = await getDatabase();
final List<Map<String, dynamic>> result =
await bancoDeDados.query(_tablename);
print('Pegando tamanho da lista');
if (result.isEmpty) {
const int varParaID = 1;
return varParaID;
} else {
int id = result.length;
final varParaID = id++;
return varParaID;
}
}
Na classe Task, única modificação é no construtor:
final int id;
final String nome;
final String image;
final int prioridade;
Task(
this.id,
this.nome,
this.image,
this.prioridade,
);
E agora por último, a parte do ElevatedButton que salva a Task, ele tem que passar o ID junto com os outros controladores, pode ser dessa forma:
ElevatedButton(
onPressed: () async {
if (_formKey.currentState!.validate()) {
final int idCorreto =
await TaskDao().pegarTamanhoDB(); //Aqui ele pega o ID
await TaskDao().save(Task(
idCorreto, //Aqui envia para o db
nameController.text,
imagemController.text,
int.parse(prioridadeController.text)));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Concluído'),
),
);
Navigator.pop(context);
}
},
É isso ai, espero ter ajudado, qualquer coisa to aqui, abraço e bons estudos.