Los generadores en Dart son una característica poderosa que permite crear secuencias de valores de manera eficiente y perezosa (lazy). En lugar de generar todos los valores de una vez y almacenarlos en la memoria, los generadores producen valores bajo demanda, lo que puede ser muy útil para trabajar con grandes conjuntos de datos o secuencias infinitas.
Conceptos Clave
- Generadores Síncronos: Utilizan la palabra clave
sync*y producen valores de manera síncrona. - Generadores Asíncronos: Utilizan la palabra clave
async*y producen valores de manera asíncrona. - Yield: La palabra clave
yieldse utiliza para producir un valor en un generador.
Generadores Síncronos
Los generadores síncronos son funciones que devuelven un Iterable. Utilizan la palabra clave sync* y yield para producir valores.
Ejemplo de Generador Síncrono
Iterable<int> contador(int max) sync* {
for (int i = 0; i <= max; i++) {
yield i;
}
}
void main() {
var numeros = contador(5);
for (var numero in numeros) {
print(numero);
}
}Explicación:
- La función
contadores un generador síncrono que produce números del 0 almax. - La palabra clave
sync*indica que es un generador síncrono. - La palabra clave
yieldse utiliza para producir cada número en la secuencia. - En el
main, se itera sobre los números generados y se imprimen.
Generadores Asíncronos
Los generadores asíncronos son funciones que devuelven un Stream. Utilizan la palabra clave async* y yield para producir valores de manera asíncrona.
Ejemplo de Generador Asíncrono
Stream<int> contadorAsincrono(int max) async* {
for (int i = 0; i <= max; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
void main() async {
var numeros = contadorAsincrono(5);
await for (var numero in numeros) {
print(numero);
}
}Explicación:
- La función
contadorAsincronoes un generador asíncrono que produce números del 0 almaxcon un retraso de 1 segundo entre cada número. - La palabra clave
async*indica que es un generador asíncrono. - La palabra clave
yieldse utiliza para producir cada número en la secuencia. - En el
main, se itera sobre los números generados utilizandoawait fory se imprimen.
Ejercicios Prácticos
Ejercicio 1: Generador de Números Pares
Instrucciones:
Crea un generador síncrono que produzca los primeros n números pares.
Solución:
Iterable<int> numerosPares(int n) sync* {
for (int i = 0; i < n; i++) {
yield i * 2;
}
}
void main() {
var pares = numerosPares(5);
for (var numero in pares) {
print(numero);
}
}Ejercicio 2: Generador de Secuencia Fibonacci Asíncrono
Instrucciones:
Crea un generador asíncrono que produzca los primeros n números de la secuencia de Fibonacci con un retraso de 500ms entre cada número.
Solución:
Stream<int> fibonacci(int n) async* {
int a = 0, b = 1;
for (int i = 0; i < n; i++) {
await Future.delayed(Duration(milliseconds: 500));
yield a;
int temp = a;
a = b;
b = temp + b;
}
}
void main() async {
var fib = fibonacci(5);
await for (var numero in fib) {
print(numero);
}
}Resumen
En esta sección, hemos aprendido sobre los generadores en Dart, tanto síncronos como asíncronos. Los generadores son útiles para producir secuencias de valores de manera eficiente y perezosa. Hemos visto ejemplos prácticos y ejercicios para reforzar los conceptos aprendidos. En la siguiente sección, exploraremos los Isolates y cómo pueden ser utilizados para realizar tareas en paralelo en Dart.
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
