【検証】Flutterでenhanced enumsの使い方を試してみる

image

はじめに

Dart2.17 から enum の機能が拡張されたようなので、使い方を試してみようと思います。(Enhanced Enums)

SDK バージョンの下限を 2.17.0 以上に

「さあ、はじめよう。」と思ったらいきなりエラー出ましたね。
SDK バージョンの下限が2.15.0になってました。

This requires the 'enhanced-enums' language feature to be enabled.  Try updating your pubspec.yaml to set the minimum SDK constraint to 2.17.0 or higher, and running 'pub get'.

pubspec.yamlenvironment部分を更新します。
sdkのバージョンが2.17.0以上になるように設定してください。  

environment:
  sdk: ">=2.17.0 <3.0.0"

中身を見てみる

参考の medium の記事で紹介されている例を使っていきます。

主な追加機能

  • enum にコンストラクタを追加できるようになった(state を持てるようになった)
  • toString()をオーバーライドできるようになった

enum のそれぞれの要素毎にコンストラクタを初期化できる。

enum Water {
  frozen(32),
  lukewarm(100),
  boiling(212);

  final int tempInFahrenheit;
  const Water(this.tempInFahrenheit);

  
  String toString() => "The $name water is $tempInFahrenheit F.";
}

ちなみにtoString()メソッドのテキストの中の$namenameは Dart の 2.15 から追加されている機能ですね。

final w = Water.frozen;
print(w.name); //frozen

toString()を使ってみる

この状態で print してみると、

 print(Water.frozen); //The frozen water is 32 F.
 print(Water.frozen.toString()); //The frozen water is 32 F.

なるほど。
printしようとすると、オーバーライドしたtoString()メソッドが勝手に反映されているのかな。

toString()をコメントアウトしたら

 // @override
 // String toString() => "The $name water is $tempInFahrenheit F.";
 print(Water.frozen); //Water.frozen

うむ。当たり前ですが従来通り。

参考
https://medium.com/dartlang/dart-2-17-b216bfc80c5d

enhanced enums にメソッドを生やす

enhanced enums なら、enumの判定メソッドも実装可能なようですね。
今まではextensionを使って書く必要がありました。

enum Water {
  frozen(32),
  lukewarm(100),
  boiling(212);

  final int tempInFahrenheit;

  const Water(this.tempInFahrenheit);

  
  String toString() => "The $name water is $tempInFahrenheit F.";

bool get isFrozen => this == frozen;
}

enum をよく条件分岐の際に使うのですが、if 文の中で以下のような条件を書くのが面倒だと思っていました。(特に enum の名前が長いときは)

if(type == SampleType.typeA){
 ...
}

Enhanced Enumsを使う必要がない場合には、従来通りextensionを作成する必要がありそうです。
extension を使った書き方はこちらの記事にまとめてあります。
https://www.kamo-it.org/blog/flutter-extension/

まとめ

いかがでしたか?
ざっくりと試してみましたが、「enum に state を持たせたい」というケースがないか意識していないと、enhanced enumsを使おうと思えない気がしますね。
使えるタイミングを探って、ぜひ試してみてください!

参考

https://medium.com/dartlang/dart-2-17-b216bfc80c5d https://qiita.com/hosikiti/items/9242a9e1d50c1dc5faa2 https://codewithandrea.com/tips/enums-with-members-dart-2.17

お知らせ

11月5日開催のアプリ開発講座の参加者募集中!!

11月5日開催のアプリ開発講座の参加者募集中!!

11月5日にアプリ開発講座を開催します!会場は岐阜県美濃加茂市のコワーキングスペース「こやぁね」です。興味のある方は是非ご参加ください!

Read More
可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More

お知らせ

11月5日開催のアプリ開発講座の参加者募集中!!

11月5日開催のアプリ開発講座の参加者募集中!!

11月5日にアプリ開発講座を開催します!会場は岐阜県美濃加茂市のコワーキングスペース「こやぁね」です。興味のある方は是非ご参加ください!

Read More
可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!

可茂IT塾ではFlutterインターンを募集しています!可茂IT塾のエンジニアの判断で、一定以上のスキルをを習得した方には有給でのインターンも受け入れています。

Read More