Intenta comprender el código bien previamente a utilizarlo a tu proyecto y si ttienes algo que aportar puedes dejarlo en los comentarios.
Solución:
yield
Se utiliza para emitir valores de flujo.
Ejemplo (yield
)
Stream str() async*
List numbers = [1, 2, 3, 4, 5];
for (var i in numbers)
if (i > 2) yield i; // only yield numbers greater than 2
main() async
await for (var i in str())
print(i);
Producción:
3
4
5
yield*
Delega a otro generador y después de que el otro generador deja de producir valores, vuelve a generar sus propios valores.
Ejemplo yield*
Stream numbersDownFrom(int n) async*
if (n > 2)
yield n;
yield* numbersDownFrom(n - 1);
main() async
await for (int i in numbersDownFrom(5))
print('$i');
Producción:
5
4
3
Fuente
Fuente
Respuesta corta
yield
devuelve valores de un Iterable o un Stream.yield*
se usa para llamar recursivamente a su función Iterable o Stream.
Ejemplos
Veamos algunos ejemplos del video Generator Functions – Flutter in Focus. Solo veremos el ejemplo de Iterable, pero es similar para Streams.
Formulario 1
Aquí hay un Iterable que cuenta desde start
para finish
.
Iterable getRange(int start, int finish) sync*
for (int i = start; i <= finish; i++)
yield i;
Él yield
palabra clave devuelve el siguiente valor en cada iteración.
Formulario 2
Ahora refactoricemos esa función para que sea recursiva. Por fuera sigue haciendo lo mismo que antes:
Iterable getRange(int start, int finish) sync*
if (start <= finish)
yield start;
for (final val in getRange(start + 1, finish))
yield val;
Esto funciona, pero es difícil de leer y no es muy eficiente debido al bucle.
Formulario 3
Ahora vamos a refactorizarlo de nuevo usando yield*
(pronunciado "estrella de rendimiento"):
Iterable getRange(int start, int finish) sync*
if (start <= finish)
yield start;
yield* getRange(start + 1, finish);
Todavía es recursivo, pero ahora es más fácil de leer y más eficiente.
Tienes la opción de asistir nuestra misión añadiendo un comentario o dejando una valoración te lo agradecemos.