Flutter&Dartでenumを使った定数を定義[SharedPreferenceのKeyなどに使用]


こんにちは、FlutterとDartでアプリ開発中の 村松龍之介 です!

Shared Preferenceの引数で使用するキーを定数で一か所に定義しようと思いました。
static constで定義しても良かったのですが、今回はenumを使用しました。

しかし、DartのEnumはString型が使えないのでExtensionで対応しました。
今回はその備忘録です。

ちなみに、DartのExtension機能は Dart 2.7 で追加されたそうです。
Extension methods | Dart

まずはExtensionの前に…

Enumで使用するKeyを定義

/// ここではSharedPreference使用するKeyを想定
enum PreferenceKey {
  one,
  two,
  three,
}

Enumに対するextensionを定義

Extensionの書式

extensionキーワードで始めて、onの後に拡張する方を書くようです。

extension <拡張名> on <拡張する型> {
  // メンバーを定義する
}

<拡張名>は必須。他ライブラリと競合した時に識別したりするのに使うようです。
自己プロジェクト用のExtensionであれば、恐らくそこまで意識する必要はないでしょう。

DartにおけるExtensionのメンバーには、
* メソッド
* Getter
* Setter
* 演算子
* Static field
* Static helper method
を定義できるようです。

Extensionの実装

extension KeyToString on PreferenceKey {
  /// 文字列にして `PreferenceKey.one` から `one` を抽出する
  String get key => toString().split('.').last;
}

ここではenum PreferenceKeyのStringを取得したい時用のGetterを定義しました。

使い方

// enum, extension を定義したファイル(ライブラリ)をインポート
import 'preference_key.dart';

PreferenceKey.timeOfDay.key; // String型の'timeOfDay'が返る

// extensionの拡張名を指定して使用する場合の記法
KeyToString(PreferenceKey.timeOfDay).key;

(蛇足)import記法

// preference_key.dartの内、extension KeyToString のみ使用する
import 'preference_key.dart' show KeyToString;
// preference_key.dartの内、extension KeyToString のみ使用しない
import 'preference_key.dart' hide KeyToString;

以上、今回はFlutter&Dartでのenumを使った定数定義の一例を書いてみました。

Dartはまだ勉強中なので、間違いやもっと良い記法がありましたらコメントや編集お願いいたします🙇‍♂️

参考

dart - Enum from String - Stack Overflow