Mobile App Development · Dart/Flutter
Execute operações demoradas — chamadas de API, leitura de arquivos, banco de dados — sem travar o programa, usando Future, async, await e Stream.
Nesta aula você vai aprender a trabalhar com programação assíncrona em Dart. Vai criar funções que retornam Future, usar async/await para esperar um resultado sem bloquear o restante do programa, tratar erros que acontecem durante uma operação assíncrona com try/catch, executar operações independentes em paralelo com Future.wait e consumir uma Stream — uma sequência de valores que chegam ao longo do tempo.
Future<T>
Representa um valor do tipo T que estará disponível no futuro, após uma operação assíncrona terminar.
async / await
async marca uma função como assíncrona, permitindo usar await dentro dela para esperar um Future ser resolvido.
Future.delayed
Cria um Future que só resolve após um tempo especificado — útil para simular latência de rede ou carregamentos.
try/catch assíncrono
Erros lançados dentro de funções async são capturados normalmente com try/catch em torno do await.
Future.wait
Executa uma lista de Futures em paralelo e espera todos terminarem, retornando os resultados na mesma ordem da lista de entrada.
Stream<T>
Representa vários valores do tipo T emitidos ao longo do tempo — diferente de Future, que resolve uma única vez.
async* / yield
Marca uma função geradora assíncrona. yield emite um valor para os ouvintes da Stream sem encerrar a função.
await for
Itera sobre cada valor emitido por uma Stream conforme eles chegam, até a Stream ser encerrada.
// Demonstração de funções assíncronas com 'async' e 'await'.
// 'async' marca a função como assíncrona, permitindo usar 'await' dentro dela.
// Funções 'async' sempre retornam um Future, mesmo que o retorno declarado seja String.
// Função assíncrona que simula uma chamada de rede com delay de 300ms.
Future<String> buscarMensagem() async {
// 'await' pausa esta função por 300ms sem bloquear a thread principal.
await Future.delayed(Duration(milliseconds: 300));
// Após o delay, retorna a mensagem normalmente.
return 'Dados recebidos com sucesso';
}
Future<void> main() async {
// Informa ao usuário que a busca começou — exibido antes do delay.
print('Buscando mensagem...');
// 'await' espera buscarMensagem() terminar antes de continuar.
String mensagem = await buscarMensagem();
// Exibido apenas após os 300ms de delay simulado.
print(mensagem);
}
Buscando mensagem... Dados recebidos com sucesso
A primeira linha aparece imediatamente; a segunda só é impressa depois que o Future.delayed resolve. O tempo exato varia conforme a máquina, mas a ordem das linhas impressas é sempre essa — é justamente isso que await garante.
Future.async.await.Future.wait.Stream.