Menu
Coddy logo textTech

Repaso - Data Fetcher

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 81 de 110.

challenge icon

Desafío

Fácil

¡Vamos a construir una clase DataFetcher que reúna todos los conceptos de POO asíncrona de este capítulo! Crearás un servicio de datos que utiliza inicialización asíncrona, métodos asíncronos para obtener elementos individuales y un flujo (stream) para entregar múltiples resultados a lo largo del tiempo.

Organizarás tu código en dos archivos:

  • data_fetcher.dart: Crea una clase DataFetcher que simule la obtención de datos de una fuente remota. Tu clase debe tener:
    • Un campo final de tipo String llamado source que almacene de dónde provienen los datos
    • Un constructor privado que inicialice la fuente
    • Un método de fábrica asíncrono estático connect(String sourceName) que devuelva un Future<DataFetcher>. Simula un retraso de conexión de 100 milisegundos, luego devuelve una nueva instancia con la fuente establecida en el nombre proporcionado
    • Un método asíncrono fetchItem(int id) que devuelva un Future<String>. Simula un retraso de 50 milisegundos, luego devuelve una cadena con el formato: [source]-Item-[id]
    • Un método generador de flujo fetchMultiple(int count) que devuelva un Stream<String>. Este debe emitir (yield) elementos para los IDs desde 1 hasta count inclusive, utilizando tu método fetchItem para cada uno (espera con await cada obtención antes de emitir)
  • main.dart: Importa tu cargador de datos y demuestra los tres patrones asíncronos trabajando juntos:
    • Imprime Connecting to data source...
    • Usa la fábrica asíncrona para conectarte a una fuente llamada CloudDB
    • Imprime Connected to [source] usando el campo source del cargador
    • Imprime una línea vacía
    • Imprime Fetching single item:
    • Obtén e imprime el elemento con ID 42
    • Imprime una línea vacía
    • Imprime Fetching multiple items:
    • Usa await for para iterar a través de fetchMultiple(3) e imprimir cada elemento
    • Imprime una línea vacía
    • Imprime All operations complete!

Este desafío combina el patrón de fábrica asíncrona estática para la inicialización, métodos asíncronos regulares para operaciones únicas y async* con yield para la transmisión de múltiples resultados. ¡Observa cómo el método de flujo puede llamar a otros métodos asíncronos internamente!

Salida 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!

Pruébalo tú mismo

import 'data_fetcher.dart';

void main() async {
  // TODO: Imprimir 'Connecting to data source...'
  
  // TODO: Usar la factory asíncrona para conectar a una fuente llamada 'CloudDB'
  
  // TODO: Imprimir 'Connected to [source]' usando el campo source del fetcher
  
  // TODO: Imprimir una línea vacía
  
  // TODO: Imprimir 'Fetching single item:'
  
  // TODO: Obtener e imprimir el elemento con ID 42
  
  // TODO: Imprimir una línea vacía
  
  // TODO: Imprimir 'Fetching multiple items:'
  
  // TODO: Usar 'await for' para iterar a través de fetchMultiple(3) e imprimir cada elemento
  
  // TODO: Imprimir una línea vacía
  
  // TODO: Imprimir 'All operations complete!'
}

Todas las lecciones de Programación Orientada a Objetos