1. Bucle for estándar
Sintaxis: for(inicialización; condición; iterador) { cuerpo del bucle }
1: Concatenación básica de cadenas
void main() {
var message = StringBuffer('welcome to FoxDevelop.com');
for (var i = 0; i < 5; i++) {
message.write('!');
}
print(message); // welcome to FoxDevelop.com!!!!!
}Lenguaje del código: Dart (dart)
El bucle recorre desde 0 hasta 5 (sin incluir el 5), es decir, i toma valores del 0 al 4, ejecutándose un total de cinco veces. En cada iteración se añade un signo de exclamación al final de la cadena welcome to FoxDevelop.com.
1ª iteración: welcome to FoxDevelop.com!
2ª iteración: welcome to FoxDevelop.com!!
…
5ª iteración: welcome to FoxDevelop.com!!!!!
Característica: las clausuras capturan índices independientes (diferencia clave con JavaScript)
En Dart cada iteración del bucle vincula una variable i independiente, evitando el fallo típico de JavaScript donde todas las funciones callback imprimen el valor final 2.
void main() {
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
for (final c in callbacks) {
c();
}
}
// Salida
// 0
// 1
Lenguaje del código: Dart (dart)
2. Bucle for-in para recorrer objetos iterables List/Set
Ideal cuando solo necesitas los valores de los elementos y no sus índices.
Sintaxis básica
class Candidate {
void interview() => print("Entrevista finalizada");
}
void main() {
var candidates = [Candidate(), Candidate()];
for (var candidate in candidates) {
candidate.interview();
}
}Lenguaje del código: Dart (dart)
Recorre la lista candidates, asigna cada elemento a la variable candidate y llama a su método interview(). Después de procesar cada elemento, el iterador avanza automáticamente al siguiente.
Uso avanzado
for-in combinado con desestructuración de patrones de objeto (Dart 3+)
class Candidate {
final String name;
final int yearsExperience;
Candidate({required this.name, required this.yearsExperience});
}
void main() {
var candidates = [
Candidate(name: "Lily", yearsExperience: 6),
Candidate(name: "Tom", yearsExperience: 3),
];
// Desestructurar campos directamente mediante patrón de objeto
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name cuenta con $yearsExperience años de experiencia laboral');
}
}
Lenguaje del código: Dart (dart)
Combinado con la desestructuración vista anteriormente, extrae automáticamente las dos propiedades del objeto a las variables name y yearsExperience, listas para usar dentro del cuerpo del bucle.
3. Método de recorrido Iterable.forEach ()
Recorrido funcional nativo de las colecciones; pasa una función callback para procesar cada elemento.
void main() {
var collection = [1, 2, 3];
collection.forEach(print);
// Salida 1 2 3
}Lenguaje del código: Dart (dart)
forEach es un método nativo de Dart disponible en cualquier colección iterable.
4. while / do-while
1. while
Evalúa la condición primero y luego ejecuta el cuerpo; es posible que el bloque no se ejecute nunca. Funciona igual que en C, C++, Java, C# y otros lenguajes.
bool isDone() => false;
void doSomething() => print("Ejecutar tarea");
void main() {
while (!isDone()) {
doSomething();
break;
}
}Lenguaje del código: Dart (dart)
Primero se evalúa !isDone(): la función devuelve false, la negación da true, por lo que se ejecuta el bloque interno:
doSomething();
break;
Al alcanzar break, se finaliza todo el bucle y se salta al código posterior al bloque while. Si isDone() devolviera true, la primera comprobación fallaría y el código interno no se ejecutaría en absoluto.
2. do-while
Ejecuta el cuerpo una vez sin condición previa y luego evalúa la restricción: se garantiza al menos una ejecución.
bool atEndOfPage() => true;
void printLine() => print("Imprimir una línea");
void main() {
do {
printLine();
} while (!atEndOfPage());
}
Lenguaje del código: Dart (dart)
Independientemente de si la condición del while final es true o false, el código dentro de do {} se ejecuta obligatoriamente una vez.
5. break / continue
break
Termina todo el bucle instantáneamente y salta a las instrucciones siguientes; el resto del cuerpo no se ejecuta.
bool shutDownRequested() => true;
void processIncomingRequests() => print("Procesar peticiones");
void main() {
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
print("Fin del bucle");
}
Lenguaje del código: Dart (dart)
continue
Omite todas las instrucciones restantes de la iteración actual y salta directamente a la siguiente iteración.
Sintaxis for tradicional
class Candidate {
final int yearsExperience;
Candidate(this.yearsExperience);
void interview() => print("Realizar entrevista");
}
void main() {
var candidates = [Candidate(3), Candidate(6)];
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue; // Saltar entrevista a candidatos con menos de 5 años de experiencia
}
candidate.interview();
}
}
Lenguaje del código: Dart (dart)
Alternativa funcional (sin continue)
void main() {
var candidates = [Candidate(3), Candidate(6)];
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
}
Lenguaje del código: Dart (dart)
6. Etiquetas Label para controlar bucles anidados
Sintaxis: escribir nombreEtiqueta: antes de un bucle, combinar con break nombreEtiqueta / continue nombreEtiqueta
Propósito: en bucles múltiples anidados, salir o saltar directamente el bucle exterior, no solo el interior.
1. break + label
Salir de un bucle doble completo
void main() {
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
print('i = $i, j = $j');
if (i == 2 && j == 2) {
break outerLoop; // Finalizar inmediatamente el bucle exterior marcado outerLoop
}
}
}
print('outerLoop exited');
}
Lenguaje del código: Dart (dart)
Salida:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Lenguaje del código: Dart (dart)
2. continue + label
Saltar directamente a la siguiente iteración del bucle exterior
void main() {
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
continue outerLoop; // Saltar todos los j restantes de i=2 y pasar directamente a i=3
}
print('i = $i, j = $j');
}
}
}
Lenguaje del código: Dart (dart)
Salida:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3
Ejemplo while+break+label
void main() {
var i = 1;
outerLoop:
while (i <= 3) {
var j = 1;
while (j <= 3) {
print('i = $i, j = $j');
if (i == 2 && j == 2) {
break outerLoop;
}
j++;
}
i++;
}
print('outerLoop exited');
}
Lenguaje del código: PHP (php)
Resultado de ejecución
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Este mecanismo funciona de forma similar a la sentencia goto de otros lenguajes de programación.
Bucles Loops