Menu
Coddy logo textTech

Recapitulação - Data Fetcher

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 81 de 110.

challenge icon

Desafio

Fácil

Vamos construir uma classe DataFetcher que reúne todos os conceitos de POO assíncrona deste capítulo! Você criará um serviço de dados que utiliza inicialização assíncrona, métodos assíncronos para buscar itens individuais e uma stream para entregar múltiplos resultados ao longo do tempo.

Você organizará seu código em dois arquivos:

  • data_fetcher.dart: Crie uma classe DataFetcher que simula a busca de dados de uma fonte remota. Sua classe deve ter:
    • Um campo final do tipo String chamado source que armazena de onde os dados vêm
    • Um construtor privado que inicializa a fonte
    • Um método de fábrica assíncrono estático connect(String sourceName) que retorna um Future<DataFetcher>. Simule um atraso de conexão de 100 milissegundos e, em seguida, retorne uma nova instância com a fonte definida para o nome fornecido
    • Um método assíncrono fetchItem(int id) que retorna um Future<String>. Simule um atraso de 50 milissegundos e, em seguida, retorne uma string no formato: [source]-Item-[id]
    • Um método gerador de stream fetchMultiple(int count) que retorna um Stream<String>. Isso deve produzir (yield) itens para IDs de 1 até count (inclusive), usando seu método fetchItem para cada um (aguarde cada busca antes de produzir o resultado)
  • main.dart: Importe seu buscador de dados e demonstre todos os três padrões assíncronos trabalhando juntos:
    • Imprima 'Connecting to data source...'
    • Use a fábrica assíncrona para se conectar a uma fonte chamada 'CloudDB'
    • Imprima 'Connected to ${fetcher.source}' usando o campo source do buscador
    • Imprima uma linha vazia
    • Imprima 'Fetching single item:'
    • Busque e imprima o item com ID 42
    • Imprima uma linha vazia
    • Imprima 'Fetching multiple items:'
    • Use await for para iterar através de fetchMultiple(3) e imprimir cada item
    • Imprima uma linha vazia
    • Imprima 'All operations complete!'

Este desafio combina o padrão de fábrica assíncrona estática para inicialização, métodos assíncronos regulares para operações únicas e async* com yield para streaming de múltiplos resultados. Observe como o método de stream pode chamar outros métodos assíncronos internamente!

Saída esperada:

Connecting to data source...
Connected to CloudDB

Fetching single item:
CloudDB-Item-42

Fetching multiple items:
CloudDB-Item-1
CloudDB-Item-2
CloudDB-Item-3

All operations complete!

Experimente você mesmo

import 'data_fetcher.dart';

void main() async {
  // TODO: Imprima 'Connecting to data source...'
  
  // TODO: Use a factory assíncrona para se conectar a uma fonte chamada 'CloudDB'
  
  // TODO: Imprima 'Connected to [source]' usando o campo source do fetcher
  
  // TODO: Imprima uma linha vazia
  
  // TODO: Imprima 'Fetching single item:'
  
  // TODO: Busque e imprima o item com ID 42
  
  // TODO: Imprima uma linha vazia
  
  // TODO: Imprima 'Fetching multiple items:'
  
  // TODO: Use 'await for' para iterar por fetchMultiple(3) e imprimir cada item
  
  // TODO: Imprima uma linha vazia
  
  // TODO: Imprima 'All operations complete!'
}

Todas as lições de Programação Orientada a Objetos