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とかでやるほうがよい。
参考文献
- 公式ドキュメント: shared_preferences | Flutter package
 - こちらも公式。シンプルなドキュメント。: Store key-value data on disk | Flutter