dart-control-flujo-enums

Control de flujo y enums en Dart

  • 4 min

El control de flujo es decidir qué instrucciones ejecutar y cuáles repetir.

Hasta ahora, nuestros programas eran una línea recta: empezaban arriba y acababan abajo. Pero el software real necesita tomar decisiones y repetir tareas.

En esta entrada vamos a ver las estructuras de control de flujo. Si vienes de C, Java o JavaScript, la sintaxis te resultará familiar. Presta especial atención a los enums, porque los usaremos con frecuencia al construir interfaces en Flutter.

Condicionales para tomar decisiones

La estructura básica para la toma de decisiones es el if y el else.

if y else

Funciona exactamente igual que en la mayoría de lenguajes de estilo C.

int bateria = 15;

if (bateria > 20) {
  print("Todo en orden");
} else if (bateria > 5) {
  print("Modo ahorro activado");
} else {
  print("Apagando sistema...");
}
Copied!

El operador ternario

En el ecosistema Flutter, el operador ternario aparece continuamente. Nos permite simplificar un if-else en una sola línea. Es muy útil para mostrar un Widget u otro en la interfaz de usuario.

La sintaxis es: condición ? valor_si_true : valor_si_false.

bool esAdmin = true;
String mensaje = esAdmin ? "Bienvenido Admin" : "Bienvenido Usuario";
Copied!

El ternario aparece con frecuencia en las expresiones que construyen la UI de Flutter. Úsalo para condiciones breves; si la lógica crece, resulta más claro extraerla o usar un if normal.

Enums: tipos enumerados

Antes de ver el switch, necesitamos hablar de los Enums.

Un enum (enumerado) es un tipo que se usa para representar un conjunto fijo de valores constantes.

Imagina que quieres gestionar el estado de una descarga. Podrías usar cadenas de texto como "cargando", "exito", "error". Pero, ¿y si te equivocas y escribes "exito" con tilde? El programa fallaría y no te darías cuenta hasta ejecutarlo.

Con Enums, el compilador nos protege.

// Definición del Enum (fuera del main habitualmente)
enum EstadoDescarga { cargando, completado, error }

void main() {
  // Uso del Enum
  EstadoDescarga estadoActual = EstadoDescarga.cargando;
  
  if (estadoActual == EstadoDescarga.completado) {
    print("Archivo listo");
  }
}
Copied!

switch y enums

El switch evalúa una expresión y ejecuta el código asociado al caso (case) que coincida.

En Dart, cuando combinas switch con enums, aparece una ayuda muy interesante: el Exhaustiveness Checking (verificación de exhaustividad).

Cuando usas un enum en un switch, el analizador puede avisarte si no cubres todos los casos posibles. Si añades un nuevo estado al enum, estos diagnósticos te ayudan a localizar los switch que debes actualizar.

EstadoDescarga estado = EstadoDescarga.error;

switch (estado) {
  case EstadoDescarga.cargando:
    print("Espere un momento...");
    break;
  case EstadoDescarga.completado:
    print("¡Listo!");
    break;
  case EstadoDescarga.error:
    print("Ups, algo falló");
    break;
}
Copied!

Si eliminas uno de los case, el analizador señalará que el switch no es exhaustivo. También puedes añadir un caso default, aunque al hacerlo perderás el aviso específico cuando aparezca un nuevo valor en el enum.

Bucles para repetir tareas

Para repetir bloques de código, Dart nos ofrece las herramientas clásicas, pero con algunas optimizaciones modernas.

Bucle for

El de toda la vida. Útil cuando necesitas el índice numérico.

for (int i = 0; i < 5; i++) {
  print("Vuelta numero $i");
}
Copied!

Bucle for-in

Este es el que usaremos el 90% de las veces. Nos permite recorrer una lista elemento por elemento sin preocuparnos de índices.

List<String> colores = ["Rojo", "Verde", "Azul"];

for (var color in colores) {
  print("El color es $color");
}
Copied!

while y do-while

Se ejecutan mientras una condición sea verdadera.

  • while: Evalúa la condición antes de ejecutar.
  • do-while: Ejecuta al menos una vez y luego evalúa.
int contador = 0;

while (contador < 3) {
  print(contador);
  contador++;
}
Copied!

break y continue

A veces necesitamos alterar el flujo normal de un bucle:

  • break: Detiene el bucle por completo y sale de él.
  • continue: Detiene la iteración actual y salta a la siguiente.
for (int i = 0; i < 10; i++) {
  if (i == 5) break; // Termina el bucle al llegar a 5
  print(i);
}
Copied!