Bucles
Aprende cómo usar bucles para controlar el flujo de tu código Dart.
Esta página muestra cómo puedes controlar el flujo de tu código Dart usando bucles y sentencias de apoyo:
- Bucles
for - Bucles
whileydo-while breakycontinue
También puedes manipular el control de flujo en Dart usando:
- Bifurcaciones (Branching), como
ifyswitch - Excepciones, como
try,catchythrow
Bucles for
#Puedes iterar con el bucle for estándar. Por ejemplo:
var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
Los closures dentro de los bucles for de Dart capturan el valor del índice.
Esto evita un error común que se encuentra en JavaScript. Por ejemplo, considera:
var callbacks = [];
for (var i = 0; i < 2; i++) {
callbacks.add(() => print(i));
}
for (final c in callbacks) {
c();
}
La salida es 0 y luego 1, como se esperaba. Por el contrario, el ejemplo
imprimiría 2 y luego 2 en JavaScript.
A veces es posible que no necesites conocer el contador de iteración actual
cuando iteras sobre un tipo Iterable,
como List o Set.
En ese caso, usa el bucle for-in para un código más limpio:
for (var candidate in candidates) {
candidate.interview();
}
En el bucle del ejemplo anterior, candidate se
define dentro del cuerpo del bucle y
se establece para hacer referencia a un valor de candidates a la vez.
candidate es una variable local.
Reasignar candidate dentro del cuerpo del bucle solo
cambia la variable local para esa iteración y
no modifica el iterable original candidates.
Para procesar los valores obtenidos del iterable,
también puedes usar un patrón (pattern) en un bucle for-in:
for (final Candidate(:name, :yearsExperience) in candidates) {
print('$name has $yearsExperience of experience.');
}
Las clases iterables también tienen un método forEach() como otra opción:
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3
While y do-while
#Un bucle while evalúa la condición antes del bucle:
while (!isDone()) {
doSomething();
}
Un bucle do-while evalúa la condición después del bucle:
do {
printLine();
} while (!atEndOfPage());
Break y continue
#Usa break para detener el bucle:
while (true) {
if (shutDownRequested()) break;
processIncomingRequests();
}
Usa continue para saltar a la siguiente iteración del bucle:
for (int i = 0; i < candidates.length; i++) {
var candidate = candidates[i];
if (candidate.yearsExperience < 5) {
continue;
}
candidate.interview();
}
Si estás usando un Iterable
como una lista o set,
la forma en que escribas el ejemplo anterior podría diferir:
candidates
.where((c) => c.yearsExperience >= 5)
.forEach((c) => c.interview());
Etiquetas
#Una etiqueta (label) es un identificador seguido por dos puntos (labelName:)
que puedes colocar antes de una sentencia para crear una
sentencia etiquetada (labeled statement). Los bucles y los switch cases a menudo se usan como
sentencias etiquetadas. Una sentencia etiquetada se puede referenciar más tarde
en una sentencia break o continue de la siguiente manera:
-
break labelName;Termina la ejecución de la sentencia etiquetada. Esto es útil para salir de un bucle externo específico cuando estás dentro de un bucle anidado. -
continue labelName;Omite el resto de la iteración actual del bucle de la sentencia etiquetada y continúa con la siguiente iteración.
Las etiquetas se utilizan para gestionar el flujo de control. A menudo se usan con bucles y switch cases, y te permiten especificar de qué sentencia salir o continuar, en lugar de afectar al bucle más interno por defecto.
Etiquetas en bucle for usando break
#
El siguiente código demuestra el uso de una etiqueta llamada outerLoop
en un bucle for con una sentencia break:
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;
}
}
}
print('outerLoop exited');
En el ejemplo anterior, cuando i == 2 y j == 2, la sentencia break outerLoop;
detiene tanto el bucle interno como el externo. Como resultado, la salida es:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Etiquetas en bucle for usando continue
#
El siguiente código demuestra el uso de una etiqueta llamada outerLoop
en un bucle for con una sentencia continue:
outerLoop:
for (var i = 1; i <= 3; i++) {
for (var j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
continue outerLoop;
}
print('i = $i, j = $j');
}
}
En el ejemplo anterior, cuando i == 2 y j == 2, continue outerLoop;
omite el
resto de las iteraciones para i = 2 y pasa a i = 3. Como resultado, la salida es:
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
Etiquetas en bucle while usando break
#
El siguiente código demuestra el uso de una etiqueta llamada outerLoop en
un bucle while con una sentencia break:
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');
En el ejemplo anterior, el programa sale tanto del bucle while interno como del externo
cuando i == 2 y j == 2. Como resultado, la salida es:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Etiquetas en bucle while usando continue
#
El siguiente código demuestra el uso de una etiqueta llamada outerLoop en
un bucle while con una sentencia continue:
var i = 1;
outerLoop:
while (i <= 3) {
var j = 1;
while (j <= 3) {
if (i == 2 && j == 2) {
i++;
continue outerLoop;
}
print('i = $i, j = $j');
j++;
}
i++;
}
En el ejemplo anterior, se omite la iteración para i = 2 y j = 2 y el bucle pasa
directamente a i = 3. Como resultado, la salida es:
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
Etiquetas en bucle do-while usando break
#
El siguiente código demuestra el uso de una etiqueta llamada outerLoop en
un bucle do-while con una sentencia break:
var i = 1;
outerLoop:
do {
var j = 1;
do {
print('i = $i, j = $j');
if (i == 2 && j == 2) {
break outerLoop;
}
j++;
} while (j <= 3);
i++;
} while (i <= 3);
print('outerLoop exited');
En el ejemplo anterior, el programa sale tanto del bucle interno como del externo cuando i == 2
y
j == 2. Como resultado, la salida es:
i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
outerLoop exited
Etiquetas en bucle do-while usando continue
#
El siguiente código demuestra el uso de una etiqueta llamada outerLoop en
un bucle do-while con una sentencia continue:
var i = 1;
outerLoop:
do {
var j = 1;
do {
if (i == 2 && j == 2) {
i++;
continue outerLoop;
}
print('i = $i, j = $j');
j++;
} while (j <= 3);
i++;
} while (i <= 3);
En el ejemplo anterior, el bucle omite i = 2 y j = 2 y pasa directamente a
i = 3.
Como resultado, la salida es:
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
A menos que se indique lo contrario, la documentación en este sitio refleja Dart 3.12.2. Página actualizada por última vez el 2025-05-05. Ver fuente oreportar un problema.