Tipo de flujo: programación asincrónica de dardo

Publicado el 22 de mayo de 2020 en Dart
Conocido objetivo: principiante
Preparación
Este artículo es parte de una serie de tres partes sobre programación asincrónica en Dart. Este artículo presenta el tipo Stream que puede ejecutar programas de forma asincrónica en Dart.
- Parte 1: Futuros: programación asincrónica con Dart
- Parte 2: Flujo: programación asincrónica con Dart
- Tercera parte (flagrante) Tipo de flujo: programación asincrónica de flecha
Mira el video de YouTube aquí
Tipo de flujo
- Suscripción única
El flujo de suscripción único está diseñado para entregar eventos en secuencia. Este tipo de flujo se utilizará cuando el orden de los eventos recibidos sea importante (por ejemplo, al adivinar un archivo). Este tipo de transmisión solo se puede escuchar una vez. Intentar escucharlos nuevamente arrojará una excepción.
- Difusión (múltiples suscriptores)
El flujo de transmisión está diseñado para entregar eventos a sus suscriptores. Cualquier suscriptor puede comenzar a escuchar el evento inmediatamente a posteriori de suscribirse al evento. La transmisión de transmisión se puede escuchar varias veces.
notas: Una única transmisión de suscripción se puede convertir en una transmisión de transmisión utilizando asBroadcastStream()
método.
Flujo de suscripción
En esta sección, veremos dos formas de suscribirse a las transmisiones:
usar
listen()
métodoUsar regulador de suscripción
usar listen()
Ejemplo 1.
//This will generate a stream and return reference to it.
Stream<int> createNumberStreamWithException(int last) async*
for (int i = 1; i <= last; i++)
if (i == 5)
throw new Exception("Demo exception when accessing 5th number");
yield i; //to be able to send spaced out events
//Example#1. Subscribing to Stream using `listen()` method
void subscribeUsingListen()
Stream stream = createNumberStreamWithException(5);
stream.listen(
(x) => print("number: $x"),
onError: (err) => print("error: $err"),
onDone: () => print("Done"),
);
//----END----//
//Entry point function
void main()
//Run Example#1.
subscribeUsingListen();
Producción:
number: 1
number: 2
number: 3
number: 4
error: Exception: Demo exception when accessing 5th number
Done
Código fuente Arreglado aquí-ejemplo 1.
Usar regulador de suscripción
El regulador de suscripción de transmisión se puede obtener pasando null
adentro listen()
como esto stream.listen(null)
.
Ejemplo # 2.
//This will generate a stream and return reference to it.
Stream<int> createNumberStreamWithException(int last) async*
for (int i = 1; i <= last; i++)
if (i == 5)
throw new Exception("Demo exception when accessing 5th number");
yield i; //to be able to send spaced out events
//Example#2. Subscribing to Stream using subscription handler
void subscribeUsingSubscriptionHandler()
Stream stream = createNumberStreamWithException(5);
var subscription = stream.listen(null);
subscription.onData((x) => print("number $x"));
subscription.onError((err) => print("error: $err"));
subscription.onDone(() => print("Done"));
//----END----//
//Entry point function
void main()
//Run Example#2.
subscribeUsingSubscriptionHandler();
Producción:
number 1
number 2
number 3
number 4
error: Exception: Demo exception when accessing 5th number
Done
Código fuente Arreglado aquí-ejemplo 2.
Flujo de muestra
Usaré la posterior secuencia para demostrar el próximo ejemplo de operación de la secuencia. Si está ejecutando el fragmento de código en DartPad, asegúrese de amplificar el posterior código para crear el flujo primero.
//This will generate a stream and return reference to it.
Stream<int> createNumberStream(int last) async*
for (int i = 1; i <= last; i++)
yield i; //to be able to send spaced out events
Operación de flujo de suscripción única
En esta sección, discutiré el uso del método Stream con la ayuda de ejemplos.
usar where()
método
Veamos un ejemplo, busque e imprima un número longevo que 3 en el ejemplo susodicho.En este ejemplo listen()
El método se suscribe a la transmisión y actúa como devolución de señal. Cada vez que encuentre un número calificado, se enviará a la devolución de señal para tomar más medidas al respecto.
Ejemplo # 3.
//Example#3. Demonstrating usage of `where()`
void filterUsingWhere()
var stream = createNumberStream(5);
stream
.where((x) => x > 3) //Filters numbers greater than 3
.listen((x) => print(x)); //prints numbers filtered
//----END----//
//Entry point function
void main()
//Run Example#3.
filterUsingWhere();
Producción:
4
5
Código fuente Arreglado aquí-ejemplo # 3.
Usar atributos de Stream
En esta sección, aprenderemos sobre las siguientes propiedades de un Stream
Con la ayuda de ejemplos. Utilicemos el ejemplo susodicho para comprender cómo se utilizan estas propiedades en la praxis.Presta atención al método de emparejamiento then()
suficiente listen()
Al usar atributos.
first
Recupere el primer evento de la transmisión.
Ejemplo # 4.
//Example#4. Demonstrating usage of `first`
void first()
var stream = createNumberStream(5);
//print the first number/event
stream.first.then(
(x) => print("First event: $x"),
);
//----END----//
//Entry point function
void main()
//Run Example#4.
first();
Producción:
First event: 1
Código fuente Arreglado aquí-Ejemplo 4.
last
Recupera el posterior evento de la transmisión.
Ejemplo # 5.
//Example#5. Demonstrating usage of `last`
void last() //A fresh stream is needed. //Single subscription stream can't be re-listened. var stream = createNumberStream(5); //print the last number/event stream.last.then((x) => print("Last event: $x"));
//----END----// //Entry point function
void main() //Run Example#5. last();
Producción:
Last event: 5
Código fuente Arreglado aquí-Ejemplo 5.
length
Recupera la largo de la secuencia.
Ejemplo # 6.
//Example#6. Demonstrating usage of `length`
void length()
var stream = createNumberStream(5);
//print the length of the stream
stream.length.then((x) => print("Length of Stream: $x"));
//----END----//
//Entry point function
void main()
//Run Example#6.
length();
Producción:
Length of Stream: 5
Código fuente Arreglado aquí-Ejemplo 6.
isEmpty
Compruebe si la secuencia está vacía.
Ejemplo # 7.
//Example#7. Demonstrating usage of `isEmpty`
void isEmpty()
var stream = createNumberStream(5);
//Check if stream is empty
stream.isEmpty.then((x) => print("Is Empty : $x"));
//Create an empty stream
stream = createNumberStream(0);
//Verify an empty stream
stream.isEmpty.then((x) => print("Is Empty : $x"));
//----END----//
//Entry point function
void main()
//Run Example#7.
isEmpty();
Producción:
Is Empty : false
Is Empty : true
Código fuente Arreglado aquí-ejemplo # 7.
Operación de transmisión de transmisión
Usemos el posterior ejemplo para convertir la transmisión de suscripción única del ejemplo susodicho en una transmisión de transmisión. asBroadcastStream()
Método y luego vuelva a comprobar todas las propiedades. Esta vez, no es necesario crear una nueva secuencia para cada operación. La transmisión de transmisión puede tener varios suscriptores o ser escuchada varias veces.
Ejemplo # 8.
//Example#8. Demonstrating BroadcastStream basic operations
void broadcastStreamBasicOperations()
var stream = createNumberStream(5);
//Converting to broadcastStream
var bStream = stream.asBroadcastStream();
//check if stream is broadcast stream or single
if (bStream.isBroadcast)
print("Broadcast Stream");
else
print("Single Stream");
//print the first number/event
bStream.first.then((x) => print("First event: $x"));
//print the last number/event
bStream.last.then((x) => print("Last event: $x"));
//print the length of the stream
bStream.length.then((x) => print("Length of Stream: $x"));
//Check if stream is empty
bStream.isEmpty.then((x) => print("Is Empty : $x"));
//empty stream on purpose
stream = createNumberStream(0);
bStream = stream.asBroadcastStream();
bStream.isEmpty.then((x) => print("Is Empty : $x"));
//----END----//
//Entry point function
void main()
//Run Example#8.
broadcastStreamBasicOperations();
Producción:
Broadcast Stream
First event: 1
Is Empty : false
Is Empty : true
Last event: 5
Length of Stream: 5
Código fuente Arreglado aquí-Ejemplo 8.
Veamos varias formas de extraer parte del flujo de datos y crear subflujos de datos. El espectador audición estos subflujos de salida.
usar take()
método
Cree un subflujo para el «número donado» del primer evento del flujo llamativo. El espectador audición este subflujo e imprime todos los medios.
Ejemplo # 9.
//Example#9. Demonstrating BroadcastStream `take()` method
void broadcastStreamTake()
var stream = createNumberStream(5);
//Converting to broadcastStream
var bStream = stream.asBroadcastStream();
//Creates a sub stream of 2 elements and
//listen on it
bStream.take(2).listen(
(x) => print("take() : $x"),
);
//----END----//
//Entry point function
void main()
//Run Example#9.
broadcastStreamTake();
Producción:
take() : 1
take() : 2
Código fuente Arreglado aquí-Ejemplo 9.
usar skip()
método
A posteriori de comerse el primer «número donado» de eventos del flujo llamativo, se crea un sub-flujo del flujo llamativo. El espectador audición este subflujo e imprime todos los medios.
Ejemplo # 10.
//Example#10. Demonstrating BroadcastStream `skip()` method
void broadcastStreamSkip()
var stream = createNumberStream(5);
//Converting to broadcastStream
var bStream = stream.asBroadcastStream();
//skips first two numbers from [1,2,3,4,5]
bStream.skip(2).listen(
(x) => print("skip() : $x"),
);
//----END----//
//Entry point function
void main()
//Run Example#10.
broadcastStreamSkip();
Producción:
skip() : 3
skip() : 4
skip() : 5
Código fuente Arreglado aquí-ejemplo # 10.
usar takeWhile()
método
Esto takeWhile()
El papel del método y take()
Cuando se cumplan plenamente las condiciones. Agreguemos una condición, cuando el número es positivo pero último que 3, seleccione / adopte el primer punto. [1, 2, 3, 4, 5], A retener, 1 y 2. takeWhile()
Se comprobarán las condiciones y se imprimirán los dos números en la consola.
Ejemplo # 11.
//Example#11. Demonstrating BroadcastStream `takeWhile()` method
void broadcastStreamTakeWhile()
var stream = createNumberStream(5);
//Converting to broadcastStream
var bStream = stream.asBroadcastStream();
//Creates a sub-stream of items less than 3, and prints the sub-stream of [1,2].
bStream.takeWhile((x) => x > 0 && x < 3).listen(
(x) => print("takeWhile() : $x"),
);
//----END----//
//Entry point function
void main()
//Run Example#11.
broadcastStreamTakeWhile();
Producción:
takeWhile() : 1
takeWhile() : 2
Código fuente Arreglado aquí-ejemplo # 11.
usar skipWhile()
método
Esto skipWhile()
El método es similar a skip()
Fuera de cumplir las condiciones.
Ejemplo # 12.
//Example#12. Demonstrating BroadcastStream `skipWhile()` method
void broadcastStreamSkipWhile()
var stream = createNumberStream(5);
//Converting to broadcastStream
var bStream = stream.asBroadcastStream();
//skips elements which are positive and
//less than 3, and prints rest.
bStream
.skipWhile((x) => x > 0 && x < 3)
.listen((x) => print("skipWhile() : $x"));
//----END----//
//Entry point function
void main()
//Run Example#12.
broadcastStreamSkipWhile();
Producción:
skipWhile() : 3
skipWhile() : 4
skipWhile() : 5
Código fuente Arreglado aquí-ejemplo # 12.
Modificar el flujo: transform()
método
Convierta los eventos de la secuencia a otro tipo. En este ejemplo, la condena de números enteros se convierte en una secuencia de cadenas.
Ejemplo # 13.
//Example#13. Demonstrating modifying a stream using `transform()` method
void modifyStreamUsingTransform()
//Stream of integer events is created.
var stream = createNumberStream(5);
//StreamTransformer prints the transformed event
var transformer =
StreamTransformer<int, String>.fromHandlers(handleData: (value, sink)
sink.add("My number is $value");
);
stream.transform(transformer).listen(
(x) => print(x),
onError: (err) => print("error: $err"),
onDone: () => print("Done"),
);
//----END----//
//Entry point function
void main()
//Run Example#13
modifyStreamUsingTransform();
Producción:
My number is 1
My number is 2
My number is 3
My number is 4
My number is 5
Done
Código fuente Arreglado aquí-ejemplo # 13.
relato
- Futuros de dardos
- Corriente de dardos
- Canal oficial de Flutter
Cocina acertado con Dart y Flutter
¿Te gusta este articulo? ¿No puede encontrar el tema que le interesa?Por crédito deje un comentario o envíeme un correo electrónico sobre el tema que desea que escriba.