Tout savoir sur les énumérations avec Flutter et Dart

Loïc Yabili
3 min readOct 3, 2023

--

Jessica Lewis on Unsplash

Les énumérations souvent abrégées par enum sont des types de classe particulière qui permettent de représenter un nombre limité de constantes.

Pourquoi utiliser une énumération plutôt qu’une classe?

Les énumérations permettent de représenter un nombre limité de constantes ce qui permet une meilleure lisibilité du code et donc une maintenance facile.

L’utilisation d’une énumération plutôt qu’une classe dépend du contexte; si on connaît d’avance toutes les valeurs il vaut mieux utiliser une énumération, dans le cas contraire il faut créer une classe.

Quelques exemples

Utilisateur: dans ce cas il faut utiliser une classe parce qu’il peut y avoir un nombre illimité d’utilisateur.

Type d’utilisateur: ici vaut mieux utiliser une énumération parce que vous devrez normalement savoir à l’avance les types d’utilisateurs de votre application (ex: admin, éditeur, lecteur).

Jour de la semaine: on sait qu’il y a sept jours dans la semaine, il faut donc utiliser une enum dans ce cas.

Les énumérations en dart

Les énumérations en dart se déclarent et s’utilisent comme dans la plupart des langages de programmation.

Déclaration

Dans cet exemple je crée une simple énumération jour de la semaine avec ses différentes valeurs.

J’écris mon code en Anglais (par habitude), vous pouvez si vous le voulez l’écrire en Français.

enum WeekDay {
monday,
tuesday,
wednesday,
thursday,
friday,
saturday,
sunday
}

Utilisation

WeekDay day = WeekDay.monday;

Aller plus loin

Présentation du problème

Reprenons notre exemple de l’enum Weekday, supposons que nous voulons ajouter un champ numéro (monday: 1, tuesday: 2, wednesday: 3, …) et un autre représentant l’abréviation (monday: “Mon”, tuesday: “Tue”, wednesday: “Wed”, …); comment pourrait-on s’y prendre 🤔?

L’une des solutions serait celle de créer des méthodes à part qui retourneront les valeurs souhaitées.

Le numéro du jour

int getDayNumber(WeekDay day) {
switch (day) {
case WeekDay.monday:
return 1;
case WeekDay.tuesday:
return 2;
case WeekDay.wednesday:
return 3;
case WeekDay.thursday:
return 4;
case WeekDay.friday:
return 5;
case WeekDay.saturday:
return 6;
case WeekDay.sunday:
return 7;
}
}

L’abréviation du jour

String getDayShortName(WeekDay day) {
switch (day) {
case WeekDay.monday:
return 'Mon';
case WeekDay.tuesday:
return 'Tue';
case WeekDay.wednesday:
return 'Wed';
case WeekDay.thursday:
return 'Thu';
case WeekDay.friday:
return 'Fri';
case WeekDay.saturday:
return 'Sat';
case WeekDay.sunday:
return 'Sun';
}
}

Et pour faire appel à ces méthodes

String day = getDayShortName(WeekDay.monday);
int dayNumber = getDayNumber(WeekDay.monday);

Cela fonctionnera correctement mais demande beaucoup de gymnastique 🏋 et pourrait rendre la maintenance beaucoup plus difficile au fur et à mesure que l’on voudra ajouter d’autres propriétés à Weekday.

Solution

Depuis sa version 2.17, Dart a amélioré les énumérations en y ajoutant la possibilité d’ajouter des champs et des méthodes directement dans l’Enum.

Pour ajouter une propriété qui représente le numéro du jour et une autre qui représente l’abréviation du jour, on aura:

enum WeekDay {

monday(1, 'Mon'),
tuesday(2, 'Tue'),
wednesday(3, 'Wed'),
thursday(4, 'Thu'),
friday(5, 'Fri'),
saturday(6, 'Sat'),
sunday(7, 'Sun');

final int number;
final String shortName;

const WeekDay(this.number, this.shortName);

}

Tous les champs doivent être final et le constructeur doit être une constante.

On a un code beaucoup plus court et propre que dans notre méthode précédente.

On peut par exemple y ajouter une méthode qui retourne le WeekDay à partir du shortName

enum WeekDay {

monday(1, 'Mon'),
tuesday(2, 'Tue'),
wednesday(3, 'Wed'),
thursday(4, 'Thu'),
friday(5, 'Fri'),
saturday(6, 'Sat'),
sunday(7, 'Sun');

final int number;
final String shortName;

const WeekDay(this.number, this.shortName);

static WeekDay fromShortName(String shortName) {

for (final WeekDay weekDay in WeekDay.values) {
if (weekDay.shortName == shortName) {
return weekDay;
}
}

throw Exception('Invalid short name: $shortName');
}

}

Cette façon de faire nous offre une multitude de possibilités, il est facile d’ajouter des méthodes et des champs tout en gardant notre code bien structuré et organisé.

Il devient ainsi simple de faire appel à ses méthodes et propriétés

WeekDay weekDay = WeekDay.fromShortName('Mon');
String day = weekDay.shortName;
int dayNumber = weekDay.number;

Conclusion

Il existe plusieurs manières d’arriver à ses fins en Dart comme dans d’autres langages de programmation, mais il est important de pouvoir utiliser au maximum les avantages qu’offre un langage de programmation pour avoir un code propre, bien structuré et donc facilement maintenable.

Dans notre cas, l’utilisation avancée des énumérations nous permet une manipulation plus compréhensible, propre et facilement maintenable.

Références

--

--

Loïc Yabili

Développeur mobile indépendant spécialisé dans le développement multi-formes avec Flutter. Je suis également intéressé par les technologies back-end: PHP, node