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