Bevor Enums in Dart verfügbar waren, habe ich einige umständliche und schwer zu wartende Codes geschrieben, um Enums zu simulieren, und möchte sie jetzt vereinfachen. Ich muss den Wert der Aufzählung als Zeichenfolge abrufen, wie dies mit Java möglich ist, aber nicht möglich ist.
Zum Beispiel gibt ein kleines Testcode-Snippet "day.MONDAY" zurück, wenn ich "MONDAY" möchte.
enum day {MONDAY, TUESDAY}
print( 'Today is $day.MONDAY');
print( 'Today is $day.MONDAY.toString()');
Stimmt es, dass ich die Zeichenfolge analysieren muss, um nur 'MONTAG' zu erhalten?
Antworten:
Leider haben Sie Recht, dass die toString-Methode zurückgegeben
"day.MONDAY"
wird und nicht die nützlichere"MONDAY"
. Sie können den Rest der Zeichenfolge wie folgt abrufen:day theDay = day.MONDAY; print(theDay.toString().substring(theDay.toString().indexOf('.') + 1));
Zugegeben, kaum bequem.
Wenn Sie alle Werte iterieren möchten, können Sie Folgendes tun
day.values
:for (day theDay in day.values) { print(theDay); }
quelle
class MyEnum { static const MyEnum someItem = const MyEnum(0); static const MyEnum someOtherItem = const MyEnum(1); final int id; const MyEnum(this.id); }
doSomething1([Status status = Status.off]) {
DartPadEtwas kürzer:
String day = theDay.toString().split('.').last;
quelle
Dart 2.7 verfügt über eine neue Funktion namens Erweiterungsmethoden . Jetzt können Sie so einfach Ihre eigenen Methoden für Enum schreiben!
enum Day { monday, tuesday } extension ParseToString on Day { String toShortString() { return this.toString().split('.').last; } } main() { Day monday = Day.monday; print(monday.toShortString()); //prints 'monday' }
quelle
describeEnum
ist eineDer einfachste Weg, den Namen einer Aufzählung zu erhalten, ist eine Standardmethode aus dem flattern / Foundation.Dart
describeEnum(enumObject) enum Day { monday, tuesday, wednesday, thursday, friday, saturday, sunday } void validateDescribeEnum() { assert(Day.monday.toString() == 'Day.monday'); assert(describeEnum(Day.monday) == 'monday'); }
quelle
Es gibt eine elegantere Lösung:
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"
quelle
Dies ist Ihre Aufzählung:
enum Day { monday, tuesday, }
Erstellen Sie eine Erweiterung (muss möglicherweise
import 'package:flutter/foundation.dart';
)extension DayEx on Day { String get inString => describeEnum(this); }
Verwendung:
void main() { Day monday = Day.monday; String inString = monday.inString; // 'monday' }
quelle
describeEnum
ist der richtige Weg. Die Verwendung einer Erweiterung ist einIch benutze die folgenden Funktionen, um den Namen des Aufzählungswerts und umgekehrt den Aufzählungswert anhand des Namens zu erhalten:
String enumValueToString(Object o) => o.toString().split('.').last; T enumValueFromString<T>(String key, Iterable<T> values) => values.firstWhere( (v) => v != null && key == enumValueToString(v), orElse: () => null, );
Bei Verwendung von Dart 2.7 und neuer funktionieren hier Erweiterungsmethoden (sowie für alle anderen Objekte):
extension EnumX on Object { String asString() => toString().split('.').last; }
Die obige Implementierung hängt nicht von den spezifischen Aufzählungen ab.
Anwendungsbeispiele:
enum Fruits {avocado, banana, orange} ... final banana = enumValueFromString('banana', Fruits.values); print(enumValueToString(banana)); // prints: "banana" print(banana.asString()); // prints: "banana"
Bearbeiten vom 05.04.2020: Nullabilitätsprüfungen hinzugefügt.
values
Parameter könnteIterable
nicht unbedingt seinList
. Implementierung der Erweiterungsmethode hinzugefügt. Die<Fruits>
Anmerkung wurde aus dem Beispiel entfernt, um zu zeigen, dass die Duplizierung des Klassennamens nicht erforderlich ist.quelle
Ich bin so darüber hinweggekommen, dass ich ein Paket gemacht habe:
https://pub.dev/packages/enum_to_string
Hat auch eine praktische Funktion, die es nimmt
enum.ValueOne
und zu "Value one
" analysiertEs ist eine einfache kleine Bibliothek, aber ihre Einheit wurde getestet und ich freue mich über Ergänzungen für Randfälle.
quelle
Mein Ansatz ist nicht grundlegend anders, könnte aber in einigen Fällen etwas bequemer sein:
enum Day { monday, tuesday, } String dayToString(Day d) { return '$d'.split('.').last; }
In Dart können Sie eine Aufzählung nicht anpassen
toString
Methode halte ich diese Problemumgehung für die Hilfsfunktion für erforderlich und für einen der besten Ansätze. Wenn Sie in diesem Fall korrekter sein möchten, können Sie den ersten Buchstaben der zurückgegebenen Zeichenfolge in Großbuchstaben schreiben.Sie können auch eine
dayFromString
Funktion hinzufügenDay dayFromString(String s) { return Day.values.firstWhere((v) => dayToString(v) == s); }
Anwendungsbeispiel:
void main() { Day today = Day.monday; print('Today is: ${dayToString(today)}'); Day tomorrow = dayFromString("tuesday"); print(tomorrow is Day); }
quelle
enum day {MONDAY, TUESDAY} print( 'Today is ${describeEnum(day.MONDAY)}' );
Konsolenausgabe: Heute ist MONTAG
quelle
Ich benutze Struktur wie unten:
class Strings { static const angry = "Dammit!"; static const happy = "Yay!"; static const sad = "QQ"; }
quelle
Ich hatte das gleiche Problem in einem meiner Projekte und die vorhandenen Lösungen waren nicht sehr sauber und es wurden keine erweiterten Funktionen wie JSON-Serialisierung / Deserialisierung unterstützt.
Flutter unterstützt derzeit nativ keine Aufzählung mit Werten. Ich habe es jedoch geschafft, ein Hilfspaket
Vnum
mit Klassen- und Reflektorimplementierung zu entwickeln, um dieses Problem zu beheben.Adresse an das Repository:
https://github.com/AmirKamali/Flutter_Vnum
Um Ihr Problem mit zu beantworten
Vnum
, können Sie Ihren Code wie folgt implementieren:@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); }
Sie können es verwenden wie:
var visibility = Visibility('COLLAPSED'); print(visibility.value);
Es gibt mehr Dokumentation im Github Repo, hoffe es hilft dir.
quelle
enum day {MONDAY, TUESDAY} print(day.toString().split('.')[1]); OR print(day.toString().split('.').last);
quelle
Anstatt die Erweiterung für jede Aufzählung zu definieren, können wir die Erweiterung für das Objekt definieren und
.enumValue
von jeder Aufzählung aus auf sie zugreifen .void main() { // ❌ Without Extension ❌ print(Countries.Cote_d_Ivoire.toString().split('.').last.replaceAll("_", " ")); // Cote d Ivoire print(Movies.Romance.toString().split('.').last.replaceAll("_", " ")); //Romance // ✅ With Extension ✅ print(Countries.Cote_d_Ivoire.enumValue); // Cote d Ivoire print(Movies.Romance.enumValue); //Romance } enum Countries { United_States, United_Kingdom, Germany, Japan, Cote_d_Ivoire } enum Movies { Romance, Science_Fiction, Romantic_Comedy, Martial_arts } extension PrettyEnum on Object { String get enumValue => this.toString().split('.').last.replaceAll("_", " "); }
Mit dieser Option können Sie sogar eine Mehrwortaufzählung definieren, bei der Wörter
_
in ihrem Namen durch (Unterstrich) getrennt sind .quelle