Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] retorno em método void

Olá estou fazendo o terceiro curso de flutter que começa a falar de banco de dados com Sqlite e pra isso usando sqflite. Tem um método save que não entendi o retorno:

class TaskDao {
  static const String CreateTableSql = """
CREATE TABLE $_tablename(
  $_name TEXT,
  $_difficulty INTEGER,
  $_image TEXT)
""";
  static const String _tablename = 'taskTable';
  static const String _name = 'name';
  static const String _difficulty = 'difficulty';
  static const String _image = 'image';
  save(Task task) async {
    print('Iniciando o save');
    final Database db = await getDatabase();
    var itemExists = await find(task.nome);
    Map<String, dynamic> taskMap = toMap(task);
    if (itemExists.isEmpty) {
      print('A tarefa não existia');
      return await db.insert(_tablename, taskMap);
    } else {
      print("A tarefa já existia");
      return await db.update(_tablename, taskMap,
          where: '$_name = ?', whereArgs: [task.nome]);
    }
  }
  (...)
  }
    }

Se o método save é um metodo que não retorna nada porque ele termina com return await db.insert(tablename, taskMap); ou return await db.update(tablename, taskMap, where: '$_name = ?', whereArgs: [task.nome]);

db.insert e db.update é do tipo Future-int então os return vão retornar inteiros. Por que o método save não é do tipo int save ou do tipo Future-int save , já que é uma função assincrona que tem que esperar dados do banco de dados e vai retornar inteiros

2 respostas
solução!

Bom dia Lucas!

Cara você fez uma ótima colocação, gostei da sua astúcia! É o seguinte, o Dart ele possui a habilidade de definir variáveis caso você não as defina:

var a = 1; // isso aqui é um int mas a gente não definiu a variável
final nome = 'Kako'; // Isso aqui é uma String mas como não definimos, o proprio flutter definiu por debaixo dos panos
funcAleatoria(){ return true;} // Isso aqui é uma função bool que não definimos mas o Flutter definiu por debaixos dos panos

Isso acontece muito! E quando isso rola o próprio flutter define o tipo do objeto para nós!

Porque não definimos o save() então? Porque começamos a criar a função sem ter em mente qual seria o seu tipo! Muitas vezes vamos iniciar um objeto sem ter certeza de qual seu tipo final, e nesses casos ta tudo bem não indicar a tipagem. É melhor não indicar do que indicar errado

O certo agora seria a gente ir no código e indicar o tipo de retorno da função save, por questões de boas práticas!

Eu vi a sua resposta agora. Obrigado. Vc tem razão, depois eu vi que quando você não define um tipo para uma função ela fica como dynamic ai pode ser um função que não retorna nada ou retorna algum coisa.