Enumeration et json : lien entre directus et flutter

Bonjour,

J’aimerais savoir s’il y a une bonne pratique pour faire le lien entre un Dropdown menu de Directus et une énumération dans Flutter. Je m’explique :

J’ai une table players dans Directus, et je souhaite pouvoir y accéder dans mon application. Si je prends l’exemple d’un champ « gender » qui a pour possibilité « male » et « female ».

Quand j’envoie une requête http, je récupère le json et dans le json me revoie un string depuis directus qui prends la valeur male ou female.

Cependant dans mon application flutter je m’étais dis que c’était (peut être) une bonne idée de gérer ce champ de la classe player à l’aide d’une enum :

enum Gender {
  Male,
  Female;
}

// et dans ma class player : 
class Player {
  //...
  Gender? gender;
//...

Pour récupérer la liste de player j’utilise le cours et passe par le constructeur suivant :

Player.fromJSON(Map<String, dynamic> json)
      : id = json["id"],
       //....
        gender = json["gender"],

Et c’est là qu’intervient mon problème : dans ce constructeur je récupère un gender sous forme de String et non sous la forme de l’ enum Gender du code Flutter.

Est ce que quelqu’un sait comment « bien » gérer ca ? Dois je abandonner l’enum et fonctionner avec des String ?

Merci d’avance :slight_smile:

J’auto alimente le sujet. Je ne sais pas si la solution que j’ai mise en place pour conserver mon énumération est pertinente, en tout cas voilà comment je m’y suis pris :

Dans mon constructeur à partir du formt json j’ai utilisé une ternaire :

Player.fromJSON(Map<String, dynamic> json)
      : id = json["id"],
       //....
        gender =(json["gender"] == "male") ? Gender.Male : Gender.Female,

Hello,

Tu peux t’amuser à manipuler ton enum avec un firstWhere exemple :

enum MyEnum {
  oneValue,
  otherValue,
  thirdValue,
  defaultValue,
}

MyEnum test = MyEnum.values.firstWhere(
                    (element) => element.name == "thirdValue",
                    orElse: () => MyEnum.defaultValue,
                  );

Cela fonctionne si la valeur stockée dans Directus à la même case que l’élément de ton enum.
Sinon faudra jouter avec les toLowerCase() par exemple.

1 « J'aime »

Perso, j’aurai fait pareil. A la rigueur un switch si il y a plus de valeurs.

1 « J'aime »