diegoRodicio

Está documentación está a túa disposición sin ningún custo económico. Sen embargo, para a súa elaboración dedico moito tempo e recursos, polo que agradecería unha colaboración co que consideres oportuno. Gracias.

View Categories

🔀 Control de fluxo

Dart ofrece diferentes formas de controlar o fluxo dun programa:

  • Condicións: if, if-case, switch
  • Bucles: for, for-in, while, do-while
  • Xestión de erros: try-catch, throw, assert

✅ Condicións #

🟢 if e else #

if (idade >= 18) {
  print('Maior de idade');
} else {
  print('Menor de idade');
}

🧩 ifcase (requere Dart 3.0) #

Permite combinar if con patróns.
Se o patrón coincide co valor, entón execútase a rama do if coas variables definidas polo patrón dispoñibles no ámbito.

No exemplo seguinte, o patrón de lista [int x, int y] coincide co valor coordenadas, así que a rama executa print(...) usando as variables x e y definidas polo patrón.

Se o valor non coincide co patrón, entón o fluxo de execución pasa á rama else, se existe:

var coordenadas = [10, 20];

if (coordenadas case [int x, int y]) {
  print('X: $x, Y: $y');
} else {
  print('Non son coordenadas válidas');
}

A declaración if-case é útil para comprobar e desestruturar un único patrón. Se queres comprobar contra múltiples patróns, deberías empregar switch.

🔁 switch #

var comando = 'ABRIR';

switch (comando) {
  case 'ABRIR':
    print('Abrindo...');
  case 'PECHAR':
    print('Pechando...');
  default:
    print('Comando non recoñecido');
}

📦 Exemplo: Comando simple #

var comando = 'ABRIR';

switch (comando) {
  case 'ABRIR':
    print('Abrindo...');
  case 'PECHAR':
    print('Pechando...');
  default:
    print('Comando non recoñecido');
}

🔢 Exemplo: Comprobación de número con rango #

var nota = 8;

switch (nota) {
  case >= 9 && <= 10:
    print('Sobresaínte');
  case >= 7 && < 9:
    print('Notable');
  case >= 5 && < 7:
    print('Aprobado');
  case >= 0 && < 5:
    print('Suspenso');
  default:
    print('Nota non válida');
}

🧍‍♂️ Exemplo: Identificación por tipo #

Object entrada = 'Ola';

switch (entrada) {
  case int _:
    print('É un número enteiro');
  case String _:
    print('É unha cadea de texto');
  case bool _:
    print('É un valor booleano');
  default:
    print('Tipo descoñecido');
}

🗺️ Exemplo: Comprobación de estrutura con patrón #

var datos = {'usuario': ['Uxía', 16]};

switch (datos) {
  case {'usuario': [String nome, int idade]}:
    print('Usuario: $nome, Idade: $idade');
  default:
    print('Estrutura incorrecta');
}

🛑 Exemplo: Uso de wildcard (_) como default #

var tecla = 'W';

switch (tecla) {
  case 'A':
    print('Mover á esquerda');
  case 'D':
    print('Mover á dereita');
  case 'W':
    print('Saltar');
  case 'S':
    print('Agachar');
  case _:
    print('Tecla non recoñecida');
}

🧠 Lembra que os patróns no switch só están dispoñibles desde Dart 3.0 en adiante.

➡️ switch expression (Dart 3.0) #

As switch expression permiten devolver un valor directamente, sen necesidade de usar break ou return. A sintaxe usa => en lugar de :

var tipo = 'galego';

var saudo = switch (tipo) {
  'galego' => 'Bo día',
  'castelan' => 'Buenos días',
  _ => 'Hello',
};

print(saudo);

👋 Exemplo: Saúdo segundo idioma #

var tipo = 'galego';

var saudo = switch (tipo) {
  'galego' => 'Bo día',
  'castelan' => 'Buenos días',
  _ => 'Hello',
};

print(saudo);

🔢 Exemplo: Avaliación de notas con rangos #

var nota = 6;

var resultado = switch (nota) {
  >= 9 && <= 10 => 'Sobresaínte',
  >= 7 && < 9   => 'Notable',
  >= 5 && < 7   => 'Aprobado',
  >= 0 && < 5   => 'Suspenso',
  _             => 'Nota non válida',
};

print('Resultado: $resultado');

👤 Exemplo: Tipo de dato con switch expression #

Object entrada = true;

var tipoDato = switch (entrada) {
  int    => 'Número enteiro',
  double => 'Número decimal',
  String => 'Texto',
  bool   => 'Booleano',
  _      => 'Descoñecido',
};

print('Tipo: $tipoDato');

🗺️ Exemplo: Desestruturación de mapa #

var usuario = {'nome': 'Sabela', 'idade': 19};

var descricion = switch (usuario) {
  {'nome': String nome, 'idade': int idade} when idade >= 18 =>
    '$nome é maior de idade',
  {'nome': String nome, 'idade': int idade} =>
    '$nome é menor de idade',
  _ => 'Datos non válidos',
};

print(descricion);

⚠️ As switch expressions requiren Dart 3.0 ou superior e non permiten fallthrough. Cada caso debe devolver sempre un valor.

🔁 Bucles #

🔃 for clásico #

for (var i = 0; i < 5; i++) {
  print('Iteración $i');
}

🔄 forin para colecións #

var nomes = ['Ana', 'Brais', 'Uxía'];

for (var nome in nomes) {
  print('Ola, $nome');
}

🔁 while e dowhile #

var contador = 0;

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

var i = 0;

do {
  print(i);
  i++;
} while (i < 3);

🚨 break e continue #

for (var i = 0; i < 5; i++) {
  if (i == 2) continue;
  if (i == 4) break;
  print(i);
}

🏷️ Etiquetas (labels) #

Permiten romper ou continuar en bucles anidados:

saidaBucle:
for (var i = 0; i < 3; i++) {
  for (var j = 0; j < 3; j++) {
    if (i == 1 && j == 1) break saidaBucle;
    print('i=$i, j=$j');
  }
}

🧨 Xestión de erros #

throw #

Lanza unha excepción:

void dividir(int x, int y) {
  if (y == 0) throw Exception('Non se pode dividir entre 0');
  print(x / y);
}

⛑️ trycatch #

Captura a excepción e evita que o programa remate:

try {
  dividir(10, 0);
} catch (e) {
  print('Erro: $e');
}

Pódese capturar tamén a traza de pila:

try {
  // Código que pode fallar
} catch (e, stack) {
  print('Erro: $e');
  print('StackTrace: $stack');
}

🔁 rethrow #

Permite capturar parcialmente e volver lanzar a excepción:

void lanzarErro() {
  try {
    throw FormatException('Formato incorrecto');
  } catch (e) {
    print('Capturado parcialmente');
    rethrow; // Lánzao de novo
  }
}

🔚 finally #

Execútase sempre, haxa ou non erro:

try {
  print('Intentando...');
} catch (e) {
  print('Erro!');
} finally {
  print('Limpando recursos...');
}

assert #

A instrución assert permite comprobar condicións durante o desenvolvemento. Se a condición é falsa, o programa lanza unha excepción (AssertionError) e detense.

⚠️ Os assert só funcionan en modo debug (non en produción).

Isto é útil para detectar erros antes de que afecten o comportamento do programa en produción.

var url = 'https://exemplo.com';
assert(url.startsWith('https'), 'A URL debe comezar con https');

🧪 Exemplos de uso #

📏 Verificar un límite #

var idade = 25;

assert(idade >= 0 && idade <= 130, 'Idade non válida');

🔤 Asegurar que un texto non está baleiro #

var nome = 'Uxía';

assert(nome.isNotEmpty, 'O nome non pode estar baleiro');

🧮 Valor numérico válido #

var resultado = 100;

assert(resultado < 100, 'O resultado debe ser menor de 100');

💡 Pódese engadir unha mensaxe descritiva como segundo argumento para facilitar o diagnóstico dos erros.

assert(condicion, 'Mensaxe explicativa opcional');

🔎 Máis información #

Exemplos: #

🔗 Ver o código en DartPad