Olá Marcos, tudo bem?
Isso mesmo, iremos utilizar o Future
para trabalhar com funções que tem comportamento assíncrono, tanto para consultas de banco de dados, quanto com API's que o nosso aplicativo utilize
Ele recebe um elemento T genérico ou existem regras. Gostaria de uma explicação um pouco mais simples.
Ela é totalmente genérica, podemos ter algo bem simples como:
Future basic() => Future.delayed( Duration( seconds: 2), () => "Olá Mundo");
E dentro do nosso código utilizar
basic().then( (valor) => print(valor));
Então basta ter uma operação assíncrona, um qualquer dado que queira responder depois de um tempo, que podemos envolver com o Future
, podemos pensar no mundo Java
com o CompletableFuture
estou acostumado com JAVA e os famigerados TRY CATCH para abrir conexão com BD
A grande questão é quando iremos tratar esse problema, até no mundo Java as vezes podemos dizer que nossa função lança um erro para não tratar naquele ponto do código, ou as vezes podemos até ver o chamado catch & rethrow
Aqui também poderíamos pensar em algum erro gerado e tratar, mas tipicamente pelo sqflite
como é um banco de dados local, a única possibilidade seria se houvesse problema em criar o banco
E dessa forma podemos delegar para outras camadas cuidar de algum erro, por exemplo uma inserção repetida, podemos deixar para a view
pegar esse erro e dar uma mensagem para o usuário
A grande questão é que com Future
não utilizaremos o try | catch
, e sim, uma função parecida com o then
, que é o catchError
Para ter o try | catch
trocaríamos esse método utilizando Future's para async | await
que é uma outra forma de trabalhar com valores futuros
Eu fiz um pequeno exemplo aqui que demonstra um pouco desse funcionamento, o primeiro comentado, é trabalhando puramente com Future
e o segundo é utilizando o async / await
Agora sim, se não utilizarmos catchError
ou try & catch
em nenhum ponto do nosso código iremos explodir um erro em produção...
Abraços e Bons Estudos :)