【Flutter】もしかしたら最高のSharedPreferencesの使い方を思いついてしまったかもしれないので公開する

Dart

概要

どうも、@daiki1003です!

Flutterでアプリを作る際、ある程度の規模になってくると
必ず必要になってくるであろうshared_preferencesパッケージ。

shared_preferences | Flutter Package
Flutter plugin for reading and writing simple key-value pairs. Wraps NSUserDefaults on iOS and SharedPreferences on Android.

今回は、そんなshared_preferencesの最高の使い方を思いついてしまったので
公開してみたいと思います。

もっとこうした方が良いとかあれば、ぜひTwitterなどで教えてください。

何が改善されているのか?

shared_preferencesに限らず、KVSで保存しようとすると
どうしてもKeyがStringになってしまいますよね。

でも、Stringの違いってコンパイラが検知してくれるものではないので
typoってしまっても誰も教えてくれません。

なので、僕は基本どの言語でも必ずenumとセットで使う様にしています。
Flutterでもそうしようと思っている矢先に思い付いたのが今回の方法です。

Flutterコードの公開

enum PreferenceKey {
  userId,
  authenticationToken,
  ...
}

extension PreferenceKeyEx on PreferenceKey {
  String get keyString {
    switch (this) {
      case PreferenceKey.userId:
        return 'user_id';
      case PreferenceKey.authenticationToken:
        return 'authentication_token';
    }
    assert(false);
    return '';
  }

  Future<bool> setInt(int value) {
    final pref = await SharedPreferences.getInstance();
    return pref.setInt(keyString, value);
  }

  Future<bool> getInt({int defaultValue}) {
    final pref = await SharedPreferences.getInstance();
    if (pref.containsKey(keyString)) {
      return pref.getInt(keyString);
    } else {
      return defaultValue;
    }
  }

  // [set|get]String, [set|get]Doubleなど全てを上述の様にラップする
}

使う側

PreferenceKey.userId.getInt(); // null
PreferenceKey.userId.getInt(defaultValue: 1); // 1

PreferenceKey.userId.setInt(15);
PreferenceKey.userId.getInt(); // 15
PreferenceKey.userId.getInt(defaultValue: 1); // 15

いかがでしょうか?
・typoの心配がない、
・基本的には存在しないキーへのアクセスも発生しない
・importがpreference_key.dartのみで良く、shared_preferences.dartのimportは必要ない
→ライブラリの変更も用意

ツッコミ等あればお待ちしております!

誰かのお役に立てば。

Twitterフォローお願いします

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非@daiki1003のフォローお願いします♪

コメント

タイトルとURLをコピーしました