【Flutter】SharedPreferencesをタイプセーフに利用できるパッケージを作った
こんにちは。広瀬マサルです。
新しい自動生成型パッケージを作成しました。
Shared Preferencesをタイプセーフに利用することができるパッケージ
です。
使い方をまとめたので興味ある方はぜひ使ってみてください!
katana_prefs
はじめに
Shared Preferencesは便利なプラグインです。
アプリの簡単なデータを保存するにはこのプラグインを利用するのが一番良いのではないかと思います。
ただ利用する際に下記の不満点があります。
- キーがString型になるのでキーを覚えておく必要がある
- 取得する値の型もキーによって違うため覚えておく必要がある
- SharedPreferencesのインスタンスが非同期で取得する必要がある
大抵は、別クラス等でラップし使いやすくしているかと思います。
上記の問題点を解消したいと思い下記のようなパッケージを作りました。
- Freezedのような記法でSharedPreferencesのデータを読み書きするクラスを自動生成
- パラメーターの型やキーは予め定義されるのでタイプセーフに実装が可能
- SharedPreferencesのインスタンスをキャッシュしておくためデータの取得が同期的に可能
-
ChangeNotifier
を継承するため値の変更を検知してなにかしらの処理を行わせることが可能
例えば下記のような記述を行ないます。
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
}
これでbuild_runnerを走らせるとSharedPreferencesのデータを読み書き可能なクラスが自動生成されます。
これを定義することでどこでもデータの読み書きが可能になります。
final appPrefs = PrefsValue(volumeSetting: 0.5);
class PrefsPage extends StatefulWidget {
const PrefsPage({super.key});
State<StatefulWidget> createState() => PrefsPageState();
}
class PrefsPageState extends State<PrefsPage> {
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
appPrefs.load();
}
Widget build(BuildContext context, WidgetRef ref){
final volumeSetting = appPrefs.volumeSetting.get();
~~~~
appPrefs.volumeSetting.set(1.0); // この時appPrefsにも変更が通知されてウィジェットの再更新が走る。
~~~~
}
}
インストール
build_runnerを用いたコードジェネレーションを行うため下記のパッケージをインポートします。
flutter pub add katana_prefs
flutter pub add --dev build_runner
flutter pub add --dev katana_prefs_builder
実装
クラス作成
下記のようにクラスを作成します。
part ‘(ファイル名).prefs.dart’;
を追加します。
定義したクラスに@prefs
のアノテーションを付与し _$(定義したクラス名)
とChangeNotifier
をmixinします。
コンストラクタはfactory
で作成しパラメーターで使用したい値を定義します。
(必須な値はrequired
を付与します。requiredを付与しない場合はそのまま記述してください)
コンストラクタの後に = _(定義したクラス名)
を記述します。
// prefs_value.dart
import 'package:flutter/material.dart';
import 'package:katana_prefs/katana_prefs.dart';
part 'prefs_value.prefs.dart';
class PrefsValue with _$PrefsValue, ChangeNotifier {
factory PrefsValue({
String? userToken,
required double volumeSetting,
}) = _PrefsValue;
}
コードジェネレーション
下記のコマンドを入力することで自動でコード生成を行います。
flutter pub run build_runner build --delete-conflicting-outputs
利用方法
グローバルに値を定義します。
オブジェクトを作成する際、required
で指定した値を入力してください。これが初期値になります。
final appPrefs = PrefsValue(volumeSetting: 0.5);
最初に値を読み込む前にload()
メソッドを実行し終了を待ちます。
(loading
フィールドを監視することで終了を待つことも可能です。)
void initState() {
super.initState();
appPrefs.load();
}
必要であればaddListener
で状態を監視することができます。
void initState() {
super.initState();
prefs.addListener(() {
setState(() {});
});
appPrefs.load();
}
appPrefs.(定義した値).get()
でSharedPreferenceからデータを取得することが可能です。
final volumeSetting = appPrefs.volumeSetting.get();
appPrefs.(定義した値).set(value)
でSharedPreferenceにデータを保存可能です。
この保存が完了したしたタイミングでnotifyListeners()
が呼ばれaddListenerで監視したコールバックを実行することができます。
appPrefs.volumeSetting.set(1.0);
おわりに
自分で使う用途で作ったものですが実装の思想的に合ってそうならぜひぜひ使ってみてください!
また、こちらにソースを公開しているのでissueやPullRequestをお待ちしてます!
また仕事の依頼等ございましたら、私のTwitterやWebサイトで直接ご連絡をお願いいたします!
GitHub Sponsors
スポンサーを随時募集してます。ご支援お待ちしております!
Discussion