注意:現在はDartでExtensionをかけるため、無理にこの方法を取る必要はないと思います。
Flutter(Dart)を書いていて、どうしても不便に感じるひとつが、enumで出来ることが少ない点です。
KotlinやSwiftであれば、enumと画面に表示する文字列であったり画像などのリソースを紐づけることも可能ですが、Dartの場合、enumを拡張することはできません。
そのため、せめてJsonをパースするときのように
enum -> String
の変換と、String -> enum
が出来るように苦し紛れで作ったのが以下のコードです。
enum_helper.dart
// [T] はenumを継承していることを前提としています
// (ここをコードレベルで書く方法が分かりませんでした…)
abstract class EnumHelper<T> {
// 基本的には[enum.values()]になります
List<T> values();
T valueOf(String value) {
return values().firstWhere((item) {
return name(item) == value;
}, orElse: () => null);
}
String name(T enumValue) {
// enumをtoStringすると<型名>.<列挙子名>となるため、[.]でsplitしたのち、lastをnameとして返却します。
return enumValue?.toString()?.split('.')?.last;
}
}
使い方は以下の通りです。
fruits.dart
enum Fruits {
apple,
orange,
strawberry
}
class FruitsHelper extends EnumHelper<Fruits> {
@override
List<Fruits> values() => Fruits.values;
}
// SharedPreferenceを使ってenumを管理するケースを想定します
Future<Fruits> getFruits() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
final fruitsString = prefs.getString("pref_key");
// 文字列からenumに変換
return FruitsHelper().valueOf(fruitsString);
}
Future<bool> setFruits(Fruits fruits) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
final fruitsString = FruitsHelper().name(fruits);
// enumをPreferencesに保存するため、文字列に変換
return prefs.setString("pref_key", fruitsString);
}
もっといいやり方や、enumをもっと便利に使えるtipsとかあったら教えてください。