Enum aprimorado: conceito avançado de Dart.

Tempo de leitura: 3 minutes

Enums (abreviação de enumerações) são um dos tipos de dados mais comumente usados em flutter. Enums podem ser definidos como um tipo de dados que nos permite definir um conjunto de valores nomeados. Um enum define uma lista finita de valores possíveis e cada valor representa uma constante distinta.

Usamos a palavra-chave enum para declarar Enums.

A sintaxe seria mais ou menos assim.

enum NameOfEnum {
  value1,
  value2,
  value3,
}

NameOfEnum myValue = NameOfEnum.value2;

if (myValue == NameOfEnum.value1) {
  print('Value 1 selected');
} else if (myValue == NameOfEnum.value2) {
  print('Value 2 selected');
} else {
  print('Value 3 selected');
}

Mesmo que isso seja altamente útil e em muitos casos nos ajude a evitar comparações dispendiosas de strings. Ainda tinha algumas deficiências.

Vejamos um exemplo.

Digamos que recebemos três status de nosso back-end para alguns registros de dados. Vamos considerar para facilitar que esses status são Sucesso, Falha e Aviso e os recebemos como string na forma de resposta Json que está em nossos modelos de dados de aplicativos.

O código para o enum ficaria assim.

enum Status {
  success,
  failure,
  warning,
}

Quando analisamos o modelo, podemos escrever um método que retornará o enum apropriado para cada string.

Status getStatusFrom({required String text}) {
  switch(text) {
    case 'Success':
      return Status.success;
    ....
}

Agora, os designers de produto acharam que seria legal exibir diferentes cores de status e emblemas na interface do usuário com base no status do registro.

Isso pode ser feito: Mas o problema é que precisamos escrever vários novos métodos/extensões para conseguir isso, o que ainda não é um problema.

Color getColorForStatus({required Status status}) {
  switch(status) {
    case Status.success:
      return Colors.green;
    ....
}

Agora, os designers de produto acharam que seria legal exibir diferentes cores de status e emblemas na interface do usuário com base no status do registro.

Isso pode ser feito: Mas o problema é que precisamos escrever vários novos métodos/extensões para conseguir isso, o que ainda não é um problema.

class Status {
  final String status;
  final Color bgColor;

  const Status._(this.name, this.value);

  static const Status enumValue1 = Status._('Value 1', 1);
  static const Status enumValue2 = Status._('Value 2', 2);
  static const Status enumValue3 = Status._('Value 3', 3);

  static const List<Status> values = [
    enumValue1,
    enumValue2,
    enumValue3,
  ];

  static Status? valueOf(String status) {
    return values.firstWhere((enumValue) => enumValue.status == status, orElse: () => null);
  }
}

Isso funcionaria. Mas esta abordagem não parece estar certa e novamente o código tornou-se menos legível e não parece ser amigável ao desenvolvedor.

No entanto, recentemente a equipe do Dart abordou esse ponto problemático. A partir da versão 2.17 do Dart, a equipe do Dart adicionou suporte para Enhanced Enums (eles realmente são Enums em Steriods).

Acho que a melhor maneira de explicar esse conceito é começar por um trecho de código.

enum Status {
  success(status: 'success', color: Colors.lightGreen, textColor: Colors.green),
  failure(status: 'failure', color: Colors.lightBlue, textColor: Colors.blue),
  warning(status: 'warning', color: Colors.orange, textColor: Colors.white);

  const Status({
    required this.status,
    required this.color,
    required this.textColor,
  });

  final String status;
  final Color color;
  final Color textColor;

  String get displayName => status.toUpperCase();
  Color get fontColor => textColor;
  Color get bgColor => color;
}

Observe como isso pode ser útil. Agora, a equipe de produto, a equipe de design e todas as outras partes interessadas podem entrar e adicionar quaisquer propriedades que desejarem a um status específico e podemos conseguir isso facilmente.

Recentemente encontrei isso no blog flutter e minha mente explodiu. Recentemente implementei um trecho semelhante no trabalho e todos que não sabiam disso ficaram chocados, para dizer o mínimo. Todos nós refatoraremos todos os nossos enums para ficar assim.

Alguns podem argumentar que isso não se qualifica como um conceito avançado, mas acho que seria um conceito avançado até que todos estejam cientes disso.

Compartilhe este blog com sua turma do flutter.

Você pode ler sobre isso na documentação do flutter: https://dart.dev/language/enums

Espero que você tenha aprendido alguma coisa. Anexei os links para meus blogs anteriores também. Obrigado.