En Dart, los streams son una forma de manejar una secuencia de eventos asincrónicos. Los streams permiten trabajar con datos que llegan de manera continua, como eventos de usuario, datos de red, o cualquier otra fuente de datos que no esté disponible de inmediato. En esta sección, aprenderemos qué son los streams, cómo funcionan y cómo utilizarlos en tus aplicaciones Dart.
Conceptos Clave
- Stream: Una secuencia de datos asincrónicos.
- StreamController: Un controlador que permite crear y gestionar un stream.
- StreamSubscription: Una suscripción a un stream que permite escuchar y manejar eventos.
- StreamTransformer: Una herramienta para transformar los datos de un stream.
Tipos de Streams
Dart ofrece dos tipos principales de streams:
- Single-subscription streams: Permiten una única suscripción. Son útiles para operaciones que se completan una sola vez, como leer un archivo.
- Broadcast streams: Permiten múltiples suscripciones. Son útiles para eventos que pueden ser escuchados por múltiples oyentes, como eventos de usuario.
Creación de Streams
Usando StreamController
El StreamController
es una forma común de crear y gestionar streams. Aquí hay un ejemplo básico:
import 'dart:async'; void main() { // Crear un StreamController final controller = StreamController<int>(); // Agregar datos al stream controller.sink.add(1); controller.sink.add(2); controller.sink.add(3); // Cerrar el stream controller.close(); // Escuchar el stream controller.stream.listen((data) { print('Received: $data'); }); }
Usando Stream.fromIterable
Otra forma de crear un stream es usando Stream.fromIterable
:
void main() { // Crear un stream a partir de una lista final stream = Stream.fromIterable([1, 2, 3]); // Escuchar el stream stream.listen((data) { print('Received: $data'); }); }
Escuchar Streams
Para escuchar un stream, utilizamos el método listen
. Aquí hay un ejemplo:
void main() { final stream = Stream.fromIterable([1, 2, 3]); // Escuchar el stream stream.listen( (data) { print('Received: $data'); }, onError: (error) { print('Error: $error'); }, onDone: () { print('Stream closed'); }, ); }
Transformar Streams
Podemos transformar los datos de un stream usando StreamTransformer
. Aquí hay un ejemplo de cómo usar map
para transformar los datos:
void main() { final stream = Stream.fromIterable([1, 2, 3]); // Transformar los datos del stream final transformedStream = stream.map((data) => data * 2); // Escuchar el stream transformado transformedStream.listen((data) { print('Received: $data'); }); }
Ejercicio Práctico
Ejercicio 1: Crear y Escuchar un Stream
- Crea un
StreamController
. - Agrega los números del 1 al 5 al stream.
- Escucha el stream y imprime cada número recibido.
Solución
import 'dart:async'; void main() { // Crear un StreamController final controller = StreamController<int>(); // Agregar datos al stream for (int i = 1; i <= 5; i++) { controller.sink.add(i); } // Cerrar el stream controller.close(); // Escuchar el stream controller.stream.listen((data) { print('Received: $data'); }); }
Ejercicio 2: Transformar un Stream
- Crea un stream a partir de una lista de números del 1 al 5.
- Transforma el stream para que cada número sea multiplicado por 3.
- Escucha el stream transformado y imprime cada número recibido.
Solución
void main() { // Crear un stream a partir de una lista final stream = Stream.fromIterable([1, 2, 3, 4, 5]); // Transformar los datos del stream final transformedStream = stream.map((data) => data * 3); // Escuchar el stream transformado transformedStream.listen((data) { print('Received: $data'); }); }
Resumen
En esta sección, hemos aprendido sobre los streams en Dart, cómo crearlos, escucharlos y transformarlos. Los streams son una herramienta poderosa para manejar datos asincrónicos y eventos en tus aplicaciones. En el siguiente tema, exploraremos los generadores, que son otra característica avanzada de Dart para manejar secuencias de datos.
Con esto, hemos cubierto los conceptos básicos y avanzados de los streams en Dart. Asegúrate de practicar los ejercicios y experimentar con diferentes tipos de streams y transformaciones para consolidar tu comprensión.
Curso de Programación en Dart
Módulo 1: Introducción a Dart
- Introducción a Dart
- Configuración del Entorno de Desarrollo
- Tu Primer Programa en Dart
- Sintaxis y Estructura Básica