Mobile App Development · Dart/Flutter

20 · Async/Await

Execute operações demoradas — chamadas de API, leitura de arquivos, banco de dados — sem travar o programa, usando Future, async, await e Stream.

1Objetivo da aula

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.

2O que vamos aprender

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.

3Exemplo comentado

// 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);
}

4Saída esperada

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.

5Do conteúdo para a prática

6Prática sugerida