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

  1. Stream: Una secuencia de datos asincrónicos.
  2. StreamController: Un controlador que permite crear y gestionar un stream.
  3. StreamSubscription: Una suscripción a un stream que permite escuchar y manejar eventos.
  4. StreamTransformer: Una herramienta para transformar los datos de un stream.

Tipos de Streams

Dart ofrece dos tipos principales de streams:

  1. Single-subscription streams: Permiten una única suscripción. Son útiles para operaciones que se completan una sola vez, como leer un archivo.
  2. 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

  1. Crea un StreamController.
  2. Agrega los números del 1 al 5 al stream.
  3. 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

  1. Crea un stream a partir de una lista de números del 1 al 5.
  2. Transforma el stream para que cada número sea multiplicado por 3.
  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.

© Copyright 2024. Todos los derechos reservados