Os enumerados (enum) serven para representar unha lista pechada de opcións: os días da semana, os estados dunha tarefa ou os tipos de usuario dunha aplicación.
Por exemplo, unha tarefa pode estar pendente, entregada ou revisada. Usar un enum evita escribir textos distintos por erro, como 'entregada' nun sitio e 'entregado' noutro.
🔸 Declarar e usar un enum
// Só se pode escoller un dos estados declarados.
enum EstadoTarefa { pendente, entregada, revisada }
void main() {
var estado = EstadoTarefa.pendente;
print(estado); // EstadoTarefa.pendente
estado = EstadoTarefa.entregada;
print(estado); // EstadoTarefa.entregada
}
Non creamos valores con EstadoTarefa(): escollemos un dos que xa declaramos. En Dart, os enums estenden automaticamente Enum.
🔹 index, name e values
index: posición do valor na declaración, empezando en 0.name: nome do valor como texto, sen o prefixo do enum.values: lista de todos os valores do enum, na orde da declaración.
enum DiaSemana { luns, martes, mercores, xoves, venres, sabado, domingo }
void main() {
// Escollemos un valor e consultamos o seu índice e nome.
var dia = DiaSemana.mercores;
print(dia.index); // 2
print(dia.name); // mercores
for (var dia in DiaSemana.values) {
print('${dia.index}: ${dia.name}');
}
}
📌 Nos identificadores escribimos
mercoresesabado, sen acento. Para amosar «mércores» ou «sábado» na pantalla podemos asociarlles un texto, igual que asociamos unha descrición no exemplo avanzado.📌 Se cambias a orde dos valores, cambian os seus índices. Non uses
indexcomo un identificador permanente para gardar datos.
🔹 Usar enums nun switch
// Só se pode escoller un dos estados declarados.
enum EstadoTarefa { pendente, entregada, revisada }
void mostrarEstado(EstadoTarefa estado) {
switch (estado) {
case EstadoTarefa.pendente:
print('Aínda tes que entregar a tarefa.');
case EstadoTarefa.entregada:
print('Diego Rodicio recibiu a tarefa.');
case EstadoTarefa.revisada:
print('Xa podes consultar a corrección.');
}
}
void main() {
mostrarEstado(EstadoTarefa.entregada);
}
En Dart 3, os casos con instrucións rematan sen necesidade de escribir break: non se executa o caso seguinte. Aquí cubrimos todos os valores do enum, polo que non necesitamos default. Se engadimos outro valor, Dart avisará de que falta tratalo.
🔹 Un paso máis: enums con atributos e métodos
Desde Dart 2.17, un enum pode ter atributos, métodos e construtores. Así podemos asociar un texto máis lexible a cada valor.
enum EstadoTarefa {
pendente('Pendente de entrega'),
entregada('Entregada ao profesor'),
revisada('Revisada por Diego Rodicio');
// Cada valor leva asociado un texto para mostrar ao usuario.
final String descricion;
const EstadoTarefa(this.descricion);
bool get estaRematada => this == EstadoTarefa.revisada;
}
void main() {
var estado = EstadoTarefa.revisada;
print(estado.descricion); // Revisada por Diego Rodicio
print(estado.estaRematada); // true
}
Fíxate nestes detalles:
- Despois da lista de valores poñemos punto e coma.
- Os atributos de instancia deben ser
final. - Os construtores xenerativos deben ser
const. namesegue devolvendo o nome do código (revisada);descriciondevolve o texto que nós asociamos.
📱 En Flutter,
MainAxisAlignment.centeré un valor dun enum: escollemos unha das opcións de aliñación que ofreceMainAxisAlignment. Non estamos chamando a un método.
🧪 Exemplo completo: tarefas do IES San Mamede
Podes copiar e executar este bloque por separado.
🔗 Ver o código en DartPad — https://dartpad.dev/?id=5da39e787dd13456a30367a4b6a78c61
🔗 Enumerados na documentación oficial de Dart — https://dart.dev/language/enums