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');
}
🧩 if
–case
(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 empregarswitch
.
🔁 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 permitenfallthrough
. Cada caso debe devolver sempre un valor.
🔁 Bucles #
🔃 for
clásico #
for (var i = 0; i < 5; i++) {
print('Iteración $i');
}
🔄 for
–in
para colecións #
var nomes = ['Ana', 'Brais', 'Uxía'];
for (var nome in nomes) {
print('Ola, $nome');
}
🔁 while
e do
–while
#
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);
}
⛑️ try
–catch
#
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 #
- Control de fluxo: https://dart.dev/language/branches
- Bucles: https://dart.dev/language/loops
- Xestión de erros: https://dart.dev/language/error-handling