Flutterで永続化ライブラリ SharedPreferencesの使い方のまとめ

Flutterアプリでシンプルなキー・バリュー形式で永続化したい場合は、 SharedPreferencesライブラリを使うと良い。

この記事では、SharedPreferencesについて解説する。

インストール方法

pubspec.yamlに以下を追加。

バージョンは「shared_preferences package - All Versions」 で確認すること。

# pubspec.yaml
dependencies:
  flutter:
    sdk: flutter

  shared_preferences: 2.5.3

そして以下を実行。

flutter pub get

使い方

使い方はシンプルで簡単。

// インスタンスを作成
final prefs = await SharedPreferences.getInstance();

// 値を保存する。
await prefs.setInt("sample", 4);
await prefs.setString("oreore", "this is sample");

// 保存した値を取得する
final sample = prefs.getInt("sample");
final oreore = prefs.getString("oreore");

// 削除
await prefs.remove('sample');

他にもboolとかをセットできる。

jsonを使って複雑なデータを保存する

上記の例のように、SharedPreferencesはシンプルなデータのみ対応している。

そこで複雑なデータに対応するためには、jsonEncode jsonDecodeを使うと良い。

例えば、以下のようなクラスを作成する。

class SaveLoadManager {
  static const String _saveKeyPrefix = 'save_data_';

  // 指定したスロットにセーブ
  // セーブしたいデータはhashで渡す。 slot を指定することもできる。
  static Future<void> save(Map<String, dynamic> data, {int slot = 0}) async {
    final prefs = await SharedPreferences.getInstance();
    final jsonString = jsonEncode(data);

    // データを保存
    await prefs.setString('$_saveKeyPrefix$slot', jsonString);

    // セーブスロットリストを更新
    await _addSlotToList(slot);
  }

  // 指定したスロットからロード
  // ハッシュとして返す
  static Future<Map<String, dynamic>?> load({int slot = 0}) async {
    final prefs = await SharedPreferences.getInstance();
    final jsonString = prefs.getString('$_saveKeyPrefix$slot');
    if (jsonString != null) {
      return jsonDecode(jsonString) as Map<String, dynamic>;
    }
    return null;
  }
}

SaveLoadManagerはシンプルなクラスだが、非常に強力な機能を備えている。

例えば、以下のように使える。

final data = {
    // 適当なハッシュデータ
}

// 保存する。(デフォルトではスロット0に保存)
SaveLoadManager.save(data);

// スロット1に保存する
SaveLoadManager.save(data, 1);

// スロット1のデータを取得
final loadData = SaveLoadManager.load(1);

複数のデータにも対応しているので、非常に柔軟性がある作りになっている。

注意点

開発環境でchromeで実行すると、永続化ができないようだ。

もし、永続化のテストをしたい場合はAndroidとかでやるほうがよい。

参考文献