
Streams
En Dart, los Streams
son una forma de trabajar con secuencias de eventos asíncronos. Un Stream
es una secuencia de valores que se pueden recibir de manera asíncrona y que se pueden consumir y procesar de manera eficiente.
Los Streams
permiten recibir y emitir eventos de forma continua a medida que están disponibles, sin tener que esperar a que todos los eventos estén listos antes de procesarlos. Esto es especialmente útil cuando se trabaja con datos en tiempo real, como flujos de datos de sensores, respuestas de API en tiempo real, interacciones de usuario y más.
Para trabajar con Streams
en Dart, se utilizan las siguientes clases y conceptos principales:
Stream
: Representa una secuencia de eventos que se pueden recibir de manera asíncrona. Puede emitir eventos y los consumidores pueden suscribirse a él para recibir y procesar los eventos.StreamController
: Es una clase que permite controlar y emitir eventos a unStream
. Permite agregar eventos alStream
y notificar a los suscriptores sobre la llegada de nuevos eventos.StreamSubscription
: Es un objeto que representa una suscripción a unStream
. Se utiliza para recibir y procesar los eventos emitidos por elStream
. Puede cancelar la suscripción en cualquier momento para dejar de recibir eventos.listen()
: Es un método que se utiliza para suscribirse a unStream
y recibir los eventos emitidos por él. Permite especificar funciones de devolución de llamada para manejar los eventos.
Aquí tienes un ejemplo básico que muestra cómo trabajar con Streams
en Dart:
import 'dart:async';
void main() {
// Crear un StreamController de tipo String
StreamController<String> streamController = StreamController<String>();
// Obtener un Stream desde el StreamController
Stream<String> stream = streamController.stream;
// Suscribirse al Stream
StreamSubscription<String> subscription = stream.listen((data) {
print('Evento recibido: $data');
});
// Emitir eventos al Stream
streamController.add('Evento 1');
streamController.add('Evento 2');
streamController.add('Evento 3');
// Cerrar el StreamController
streamController.close();
// Cancelar la suscripción al Stream
subscription.cancel();
}
En el ejemplo anterior, se crea un StreamController
de tipo String
utilizando StreamController<String>
. Luego, se obtiene un Stream
a partir del StreamController
utilizando streamController.stream
.
A continuación, se suscribe al Stream
utilizando el método listen()
y se proporciona una función de devolución de llamada que imprimirá los eventos recibidos.
Después de suscribirse al Stream
, se emiten eventos utilizando el método add()
del StreamController
. En este caso, se agregan tres eventos de tipo String
.
Finalmente, se cierra el StreamController
utilizando el método close()
y se cancela la suscripción al Stream
utilizando el método cancel()
.
En el resultado de la ejecución, verás que se imprimen los eventos recibidos.
Los Streams
son una herramienta poderosa para trabajar con eventos asíncronos en Dart. Te permiten manejar secuencias de eventos de manera eficiente y procesarlos a medida que llegan, lo que facilita la programación asíncrona y el trabajo con flujos continuos
de datos.
Ejercicio de la Sesión:
void main() {
emitNumbers().listen( (value) {
print('Stream value: $value');
});
}
Stream<int> emitNumbers() {
return Stream.periodic( const Duration(seconds: 1), (value){
// print('desde periodic $value');
return value;
}).take(5);
}