Repaso - Data Fetcher
Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy — lección 81 de 110.
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 claseDataFetcherque simule la obtención de datos de una fuente remota. Tu clase debe tener:- Un campo
finalde tipoStringllamadosourceque 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 unFuture<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 unFuture<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 unStream<String>. Este debe emitir (yield) elementos para los IDs desde 1 hastacountinclusive, utilizando tu métodofetchItempara cada uno (espera con await cada obtención antes de emitir)
- Un campo
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 forpara iterar a través defetchMultiple(3)e imprimir cada elemento - Imprime una línea vacía
- Imprime
All operations complete!
- Imprime
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
1Fundamentos de POO
Archivos externosLibrerías e importacionesIntroducción a la POOClases vs. ObjetosLa palabra clave thisMétodosVariables de instanciaConceptos básicos de constructoresResumen - Calculadora sencilla4Seguridad de nulos
Introducción a la seguridad de nulosNulables vs No nulablesLos operadores ? y !Palabra clave Late y Null SafetyOperadores Null-awareNull Safety en clasesResumen - Sistema de perfil de usuario7Clases abstractas e interfaces
Clases abstractasMétodos abstractosInterfaces en DartInterfaces implícitasImplementar vs. ExtenderInterfaces múltiplesRepaso - Calculadora de figuras10Colecciones y Genéricos
Visión general de List, Set y MapColecciones con seguridad de tiposClases genéricasMétodos genéricosRestricciones genéricasIterable e IteratorResumen - Almacenamiento genérico2Constructores en Dart
Constructor por defectoConstructores nombradosListas de inicializaciónConstructores constantesConstructores de fábricaConstructores de redireccionamientoResumen - Constructor de formas5Encapsulamiento
Miembros públicos vs. privadosLa convención del prefijo _Privacidad a nivel de libreríaProfundidad en Getters y SettersOcultamiento de informaciónResumen - Registros de estudiantes8Mixins
Introducción a los MixinsCreación de MixinsUso de múltiples MixinsPalabra clave on en MixinsMixin vs HerenciaMixin vs InterfazResumen - Sistema Animal11Métodos especiales
Sobrescritura de toString()Sobrescritura de hashCode y ==Interfaz ComparableMétodo call()Sobrescritura de noSuchMethodResumen - Colección personalizada14Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy3Propiedades de clase
Miembros de instancia vs. estáticosCampos Final y ConstVariables LateMétodos y campos estáticosGetters y SettersResumen - Gestor de cuentas bancarias6Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosLa anotación @overrideLa palabra clave final en clasesConstructores y herenciaResumen - Jerarquía de empleados9Polimorfismo
Fundamentos del polimorfismoPolimorfismo mediante interfacesComprobación de tipos en tiempo de ejecuciónLos operadores is y asPalabra clave covariantResumen - Procesador de pagos12POO Asíncrona
Futures y async/awaitFundamentos de StreamsStream ControllersConstructores asíncronosAsincronía en métodos de claseRepaso - Data Fetcher15Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository