Mobile App Development · Dart/Flutter

20 · Async/Await — Desafios

Dois cenários mais próximos do mundo real: um dashboard carregado em paralelo com Future.wait e um pipeline de pedido processado em etapas sequenciais.

Desafio 1

desafio_01_carregar_dashboard.dart

Três funções assíncronas simulam o carregamento de usuário, pedidos e notificações, cada uma com 300ms de latência. Future.wait as executa em paralelo dentro de um try/catch, retornando os resultados na mesma ordem da lista de entrada. A mensagem "Carregando dashboard..." aparece antes do await Future.wait; o cabeçalho e os itens só aparecem depois que todas as três operações terminam.

// Desafio: carregar dados do dashboard em paralelo com Future.wait e try/catch.
// Simula o carregamento simultâneo de múltiplos dados de uma API.

// Simula o carregamento de dados do usuário logado.
Future<String> carregarUsuario() async {
  await Future.delayed(Duration(milliseconds: 300));
  return 'Usuario: Ana';
}

// Simula o carregamento da lista de pedidos do usuário.
Future<String> carregarPedidos() async {
  await Future.delayed(Duration(milliseconds: 300));
  return 'Pedidos: 4';
}

// Simula o carregamento das notificações pendentes do usuário.
Future<String> carregarNotificacoes() async {
  await Future.delayed(Duration(milliseconds: 300));
  return 'Notificacoes: 2';
}

Future<void> main() async {
  // try/catch envolve Future.wait para capturar falhas de qualquer um dos Futures.
  try {
    print('Carregando dashboard...');

    // Future.wait executa as três funções simultaneamente.
    // Retorna uma List<String> com os resultados na ordem da lista fornecida.
    // Se qualquer Future falhar, o catch captura a exceção.
    List<String> dados = await Future.wait([
      carregarUsuario(),
      carregarPedidos(),
      carregarNotificacoes(),
    ]);

    print('=== Dashboard ===');

    // Percorre e exibe cada dado carregado em paralelo.
    for (String item in dados) {
      print(item);
    }
  } catch (erro) {
    // Exibe erro caso qualquer uma das operações assíncronas falhe.
    print('Falha ao carregar dashboard: $erro');
  }
}

Saída esperada

Carregando dashboard...
=== Dashboard ===
Usuario: Ana
Pedidos: 4
Notificacoes: 2

Como executar

dart run 20-Async_Await/03_Desafios/codigo_fonte/desafio_01_carregar_dashboard.dart

Desafio 2

desafio_02_pipeline_pedido.dart

Simula um pipeline de pedido com três etapas assíncronas — validar, pagar e enviar —, cada uma aguardada em sequência com await dentro de um único try/catch. Como validarPedido(2) recebe uma quantidade válida (maior que zero) e processarPagamento(150) recebe um valor válido, nenhuma etapa lança exceção e as três seguem até o fim. Se a quantidade ou o valor fossem inválidos, a etapa correspondente lançaria Exception e as etapas seguintes não seriam executadas.

// Desafio: simular um pipeline assíncrono de processamento de pedido.
// Cada etapa aguarda a conclusão da anterior — processamento em sequência.

// Etapa 1: valida a quantidade do pedido.
Future<String> validarPedido(int quantidade) async {
  await Future.delayed(Duration(milliseconds: 200));

  // Lança Exception se a quantidade for inválida (zero ou negativa).
  if (quantidade <= 0) {
    throw Exception('Quantidade invalida');
  }

  return 'Pedido validado';
}

// Etapa 2: processa o pagamento com o valor informado.
Future<String> processarPagamento(double valor) async {
  await Future.delayed(Duration(milliseconds: 200));

  // Lança Exception se o valor for zero ou negativo.
  if (valor <= 0) {
    throw Exception('Valor invalido');
  }

  return 'Pagamento aprovado';
}

// Etapa 3: envia o pedido após validação e pagamento aprovados.
Future<String> enviarPedido() async {
  await Future.delayed(Duration(milliseconds: 200));
  return 'Pedido enviado';
}

Future<void> main() async {
  // try/catch envolve todo o pipeline: se qualquer etapa falhar,
  // as etapas subsequentes não são executadas e o erro é capturado.
  try {
    // Executa cada etapa em sequência usando 'await'.
    // O resultado de cada etapa é impresso antes de avançar para a próxima.
    print(await validarPedido(2));
    print(await processarPagamento(150));
    print(await enviarPedido());
    print('Fluxo concluido');
  } catch (erro) {
    // Captura falha em qualquer uma das etapas do pipeline.
    print('Falha no pedido: $erro');
  }
}

Saída esperada

Pedido validado
Pagamento aprovado
Pedido enviado
Fluxo concluido

Como executar

dart run 20-Async_Await/03_Desafios/codigo_fonte/desafio_02_pipeline_pedido.dart