【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フォローお願いします

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

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

Twitterコミュニティ参加お願いします

Twitterコミュニティ「Flutter lovers」を開設しました!
参加お待ちしております😁

☕️ Buy me a coffee

また、記事がとても役に立ったと思う人は
コーヒーを奢っていただけると非常に嬉しいです!

コメント

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