diegoRodicio

View Categories

🏷️ Enumerados

Tempo de lectura estimado: 3 minutos

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 mercores e sabado, 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 index como 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.
  • name segue devolvendo o nome do código (revisada); descricion devolve o texto que nós asociamos.

📱 En Flutter, MainAxisAlignment.center é un valor dun enum: escollemos unha das opcións de aliñación que ofrece MainAxisAlignment. 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