LoginSignup
7
7

More than 1 year has passed since last update.

Dartのenumを文字列と相互変換できるようにする

Last updated at Posted at 2019-07-12

注意:現在は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とかあったら教えてください。

7
7
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7