Mobile App Development · Dart/Flutter
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
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
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