😽

【Flutter】EnumをFirestoreでいい感じに使う方法(converter)

2023/01/10に公開
3

enumを使ったものの、そのまま更新したくない。

たとえば、果物を管理するEnumがあるとする。

fruit
enum Fruit {
  none,
  apple,
  orange;
}

これをそのままFireStoreに入れるとなんか気持ち悪い。
String型は容量も圧迫するので、避けたい。

だからこうする。

fruit
enum Fruit {
  apple(1, "りんご"),
  orange(2, "オレンジ");

  final int value;
  final String name;

  const Fruit(this.value, this.name);

  
  String toString() => name;

  int toJson() => value;

  factory Fruit.fromJson(int? json) {
    switch (json) {
      case 1:
        return Fruit.apple;
      case 2:
        return Fruit.orange;
      case null:
      default:
        return Fruit.none;
    }
  }
}

Firestoreの更新時にtoJson、Firestoreからの取得時にfromJson、
画面に表示するときは、toStringが使えて幸せになれそう。

Discussion

yamadayamada

貴重な記事をありがとうございます。
一つ質問なのです。

このenumの使い方として、

final apple = Fruit.apple.fromJson(json);

と、なると思うのですが、

final fruit = Fruit.fromJson(json);

というふうに記述することはenumではできないですよね?

じゅんいちじゅんいち

コメントありがとうございます
下記のような拡張メソッドを作ってあげると良いと思います!

extension Fruit Extension on Iterable< Fruit > {
  Fruit? fromJson(int? json) {
    switch (name) {
      case 1:
        return Fruit.apple;
      case 2:
        return Fruit.orange;
      default:
        return null;
    }
  }
}