目的
- 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を入れようとして怒られる。
自画自賛ですがとてもエレガントにできたと思うので
SharedPreferenceを使うときにこの方式を検討してみてください。
参考記事
https://blog.logrocket.com/deep-dive-enhanced-enums-flutter-3-0/
dart2.7未満では使えないです。