web-dev-qa-db-fra.com

Dart Comment obtenir la "valeur" d'une énumération

Avant que les énumérations soient disponibles dans Dart, j'ai écrit du code lourd et difficile à maintenir pour simuler les énumérations et je veux maintenant le simplifier. J'ai besoin d'obtenir la valeur de l'énumération sous la forme d'une chaîne telle que cela peut être fait avec Java mais ne peut pas.

Par exemple, un petit extrait de code de test renvoie "day.MONDAY" dans chaque cas lorsque ce que je veux est "MONDAY"

enum day {MONDAY, TUESDAY}
print( 'Today is $day.MONDAY');
print( 'Today is $day.MONDAY.toString()');

Ai-je raison de dire que pour obtenir juste "LUNDI", je devrai analyser la chaîne?

42
Nate Lockwood

Malheureusement, vous avez raison de dire que la méthode toString renvoie "day.MONDAY", et pas le plus utile "MONDAY". Vous pouvez obtenir le reste de la chaîne comme suit:

day theDay = day.MONDAY;      
print("${theDay.toString().substring(theDay.toString().indexOf('.')+1)}");

Certes, pas pratique.

Si vous souhaitez itérer toutes les valeurs, vous pouvez le faire en utilisant day.values:

for (day theDay in day.values) {
  print(theDay);
}
31
lrn

Un peu plus court:

String day = theDay.toString().split('.').last;
55

Le moyen le plus simple d'obtenir le nom d'une énumération est une méthode standard à partir du flutter/foundation.

describeEnum(enumObject)

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

void validateDescribeEnum() {
  assert(Day.monday.toString() == 'Day.monday');
  assert(describeEnum(Day.monday) == 'monday');
}
26
gbixahue

Dart 2.7 est livré avec une nouvelle fonctionnalité appelée Méthodes d'extension . Vous pouvez maintenant écrire vos propres méthodes pour Enum aussi simple que cela!

enum Day { monday, tuesday }

extension on Day {
  String toShortString() {
    return this.toString().split('.').last;
  }
}

main() {
  Day monday = Day.monday;
  print(monday.toShortString()); //prints 'monday'
}
26
mbartn

Il existe une solution plus élégante:

enum SomeStatus {
  element1,
  element2,
  element3,
  element4,
}

const Map<SomeStatus, String> SomeStatusName = {
  SomeStatus.element1: "Element 1",
  SomeStatus.element2: "Element 2",
  SomeStatus.element3: "Element 3",
  SomeStatus.element4: "Element 4",
};

print(SomeStatusName[SomeStatus.element2]) // prints: "Element 2"
14
Daniel Vladco

J'utilise ces deux fonctions pour obtenir le nom de la valeur enum et, inversement, la valeur enum par le nom:

String enumValueToString(Object o) => o.toString().split('.').last;

T enumValueFromString<T>(String key, List<T> values) =>
    values.firstWhere((v) => key == enumValueToString(v), orElse: () => null);

Exemples d'utilisation:

enum Fruits {avocado, banana, orange}
...
final banana = enumValueFromString<Fruits>('banana', Fruits.values);
print(enumValueToString(banana)); // prints: "banana"
3

J'en ai tellement fini que j'ai fait un paquet:

https://pub.dev/packages/enum_to_string

Dispose également d'une fonction pratique qui prend enum.ValueOne et l'analyse en "Value one "

C'est une petite bibliothèque simple mais son unité a été testée et je salue tous les ajouts pour les cas Edge.

2
Ryan Knell

J'utilise la structure comme ci-dessous:

class Strings {
  static const angry = "Dammit!";
  static const happy = "Yay!";
  static const sad = "QQ";
}
2
Nae

J'ai eu le même problème dans l'un de mes projets et les solutions existantes n'étaient pas très propres et ne prenaient pas en charge les fonctionnalités avancées telles que la sérialisation/désérialisation json.

Flutter ne prend actuellement pas en charge enum enum avec des valeurs, cependant, j'ai réussi à développer un package d'assistance Vnum en utilisant l'implémentation de classe et de réflecteurs pour surmonter ce problème.

Adresse du référentiel:

https://github.com/AmirKamali/Flutter_Vnum

Pour répondre à votre problème en utilisant Vnum, vous pouvez implémenter votre code comme ci-dessous:

@VnumDefinition
class Visibility extends Vnum<String> {
  static const VISIBLE = const Visibility.define("VISIBLE");
  static const COLLAPSED = const Visibility.define("COLLAPSED");
  static const HIDDEN = const Visibility.define("HIDDEN");

  const Visibility.define(String fromValue) : super.define(fromValue);
  factory Visibility(String value) => Vnum.fromValue(value,Visibility);
}

Vous pouvez l'utiliser comme:

var visibility = Visibility('COLLAPSED');
print(visibility.value);

Il y a plus de documentation dans le dépôt github, j'espère que cela vous aidera.

1
Amir.n3t

Obtenez la valeur d'Enum d'une manière simple

enum day {MONDAY, TUESDAY}
print( 'Today is ' + describeEnum(day.MONDAY));

Renvoie une brève description d'une valeur énumérée.

1
Kalpesh Dabhi

Mon approche n'est pas fondamentalement différente, mais pourrait être légèrement plus pratique dans certains cas:

enum Day {
  monday,
  tuesday,
}

String dayToString(Day d) {
  return '$d'.split('.').last;
}

Dans Dart, vous ne pouvez pas personnaliser la méthode toString d'une énumération, donc je pense que cette solution de contournement est nécessaire et c'est l'une des meilleures approches. Si vous vouliez être plus correct dans ce cas, vous pourriez mettre la première lettre de la chaîne retournée en majuscule.

Vous pouvez également ajouter une fonction dayFromString

Day dayFromString(String s) {
  return Day.values.firstWhere((v) => dayToString(v) == s);
}

Exemple d'utilisation:

void main() {
  Day today = Day.monday;
  print('Today is: ${dayToString(today)}');
  Day tomorrow = dayFromString("tuesday");
  print(tomorrow is Day);
}
1
Vince Varga