Isso mesmo!
Você pode trabalhar com Future
em Flutter
da mesma forma que utiliza Promises
em javascript
Mas essa função nos devolve uma Future e dado que temos isso, precisamos utilizar o then e caso não tenha um return dentro do then teremos um Future vazio
Vou trazer um pouco mais para o mundo javascript para que fique mais fácil, imagine o seguinte exemplo:
function fakeAPI(){
return new Promise( (resolve, reject) => {
resolve([
{id: 1, nome: "Geovani", fav: "Clojure"},
{id: 2, nome: "Wanderson", fav: "Typescript"},
{id: 3, nome: "Nadia", fav: "Python"}
])
})
}
function fetchDataFromAPI(){
return fakeAPI().then( dados => {
const finalResponse = { sucesso: true, quantidade: dados.length, ...dados}
return finalResponse;
})
}
(function(){
console.log("Buscando dados da APi....")
fetchDataFromAPI().then(console.log)
})()
Neste exemplo o getDatabasesPath
equivale ao fetchDataFromAPI
, veja que ele recebe uma Promise
e eu pego o conteúdo retornado pela api e chamo de dados
, e faço apenas uma pequena adição
Teremos o seguinte retorno:
Buscando dados da APi....
{
'0': { id: 1, nome: 'Geovani', fav: 'Clojure' },
'1': { id: 2, nome: 'Wanderson', fav: 'Typescript' },
'2': { id: 3, nome: 'Nadia', fav: 'Python' },
sucesso: true,
quantidade: 3
}
Se você tirar o return
interno:
function fetchDataFromAPI(){
return fakeAPI().then( dados => {
const finalResponse = { sucesso: true, quantidade: dados.length, ...dados}
})
}
Teremos:
Buscando dados da APi....
undefined
Por mais que realizamos as operações internas, o then
cria uma nova promise, e se ela não tem retorno, temos uma Promise<void>
que traz undefined
Então no Flutter é a mesma coisa:
<--- Retorna uma Nova Promise -------->
return getDatabasesPath().then((dbPath) {
<------- Promise Interna ---------->
final String path = join(dbPath, 'bytebank.db');
return openDatabase(path, onCreate: (db, version){
db.execute('CREATE TABLE contacts('
'id INTEGER PRIMARY KEY, '
'name TEXT, '
'account_number INTEGER)');
}, version: 1);
});
Para que a promise mais externa tenha resultado é necessário que as internas sejam resolvidas e tragam retorno :)
Parece um pouco complexo, mas conforme vai fazendo requisições a API, e utilizando recurso de assincronismo, vai ficando mais fácil :)
Abraços e Bons Estudos!