0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterのEnhanced enumとジェネリクスを使って良い感じにSharedPreferenceを実装する

Last updated at Posted at 2024-08-09

目的

  • FlutterのSharedPreferenceの呼び出しを簡略化したい
  • 呼び出しもとがSharedPreferenceの型をあまり意識しない作りにしたい

tl;dr

dartのenhanced enumならジェネリクスを使った表現ができる。
型指定をenum内でわかるようにすればSharedPreferenceに対応する値がどんな型なのか一目で理解できる

実装

キー一覧のenum

enum PrefKey<T> {
    userId<String>('USER_ID', ''),
    age<int>('AGE', 20),
    ;

    final String key;
    final T defaultValue;

    PrefKey(this.key, this.defaultValue);

    Future<T> get() async {
        return await _SharedPreferenceManager<T>().get(this);
    }
    
    Future<void> set(T newValue) async {
        await _SharedPreferenceManager<T>().set(this, newValue);
    }
}

SharedPreferenceの管理クラス

SharedPreferenceの実際の取得や登録については他の記事を参考にしてください

/// PrefKeyと同じファイルにある想定で非公開クラスにしてあります
class _SharedPreferenceManager<T> {
  Future<T> get(PrefKey key) async {
    // SharedPreferenceから取得した値をTに変換して返却
    return key.defaultValue;
  }

  Future<void> set(PrefKey key, T newValue) async {
    // SharedPreferenceに値を登録する

  }

}

実際に使うとき

class UseCase {
  Future<void> useCase() async {
    await PrefKey.userId.set('newValue');
    final userId = await PrefKey.userId.get();
    print(userId);

    await PrefKey.age.set(2024);
    final age = await PrefKey.age.get();
  }
}

使うときに型を強制できるので数値やboolで欲しい場所では型チェックが不要になる。
また、エディタやコンパイル時のチェックが働くので間違いが起きにくい。
intの引数にStringを入れようとして怒られる。
スクリーンショット 2024-08-10 0.11.05.png

自画自賛ですがとてもエレガントにできたと思うので
SharedPreferenceを使うときにこの方式を検討してみてください。

参考記事

https://blog.logrocket.com/deep-dive-enhanced-enums-flutter-3-0/
dart2.7未満では使えないです。

0
0
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?