Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Unhandled Exception: DatabaseException(error database_closed)

O erro está no título, acontece quando eu tento salvar uma task nova

save(Tasks tarefa) async {
    Database db = await getDatabase();

    var exists = await find(tarefa.nome);

    if (exists.isEmpty) {
      return await db.insert(_tbName, toMap(tarefa));
    } else {
      return await db.update(_tbName, toMap(tarefa),
          where: '$_clNome = ?', whereArgs: [tarefa.nome]);
    }
  }
ElevatedButton(
                      onPressed: () {
                        if (_formKey.currentState!.validate()) {
                          String nome = controllerNome.text;
                          int dificuldade =
                              int.parse(controllerDificuldade.text);
                          String urlImagem = controllerImagem.text;

                          ScaffoldMessenger.of(context).showSnackBar(
                              const SnackBar(
                                  content: Text('Adicionando Tarefa...')));
                          TaskDAO().save(Tasks(nome, urlImagem, dificuldade));
                          Navigator.pop(context);
                        }
                      },
                      child: const Text('Adicionar'))

Stacktrace completo:

E/flutter ( 6636): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: DatabaseException(error database_closed)
E/flutter ( 6636): #0      SqfliteDatabaseMixin.checkNotClosed (package:sqflite_common/src/database_mixin.dart:438:7)
E/flutter ( 6636): #1      SqfliteDatabaseExecutorMixin.rawInsert (package:sqflite_common/src/database_mixin.dart:48:8)
E/flutter ( 6636): #2      SqfliteDatabaseExecutorMixin.insert (package:sqflite_common/src/database_mixin.dart:59:12)
E/flutter ( 6636): #3      TaskDAO.save (package:alura_flutter_curso_1/data/task_dao.dart:20:23)
E/flutter ( 6636): <asynchronous suspension>
E/flutter ( 6636):
1 resposta
solução!

Encontrei o erro. Devido ao meu passado com Java, eu estava fechando a conexão com o banco quando eu rodava um método. Aparentemente não é o que eu deveria fazer no dart.

  Future<List<Tasks>> find(String name) async {
    final Database db = await getDatabase();
    final List<Map<String, Object?>> rs =
        await db.query(_tbName, where: '$_clNome = ?', whereArgs: [name]);
    //db.close(); <--- Não pode.
    return toList(rs);
  }

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