8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-25

こんにちは、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

8
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
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?