【Flutter】Katana Prefs - mathru.net | Flutter/Unityによるアプリ開発/楽曲・映像制作/素材配布
2023-01-19

【Flutter】Katana Prefs

こんにちは。広瀬マサルです。

新しい自動生成型パッケージを作成しました。

Shared Preferencesをタイプセーフに利用することができるパッケージ

です。

使い方をまとめたので興味ある方はぜひ使ってみてください!

katana_prefs

The base part of the package for type-safe use of retrieving and storing Shared Preferences values, defining data in a Freezed-like fashion.
https://pub.devhttps://pub.dev
title
Building system for katana prefs packages. The package for type-safe use of retrieving and storing Shared Preferences values, defining data in a Freezed-like fashion.
https://pub.devhttps://pub.dev
title

はじめに

Shared Preferencesは便利なプラグインです。

アプリの簡単なデータを保存するにはこのプラグインを利用するのが一番良いのではないかと思います。

ただ利用する際に下記の不満点があります。

  • キーがString型になるのでキーを覚えておく必要がある
  • 取得する値の型もキーによって違うため覚えておく必要がある
  • SharedPreferencesのインスタンスが非同期で取得する必要がある

大抵は、別クラス等でラップし使いやすくしているかと思います。

上記の問題点を解消したいと思い下記のようなパッケージを作りました。

  • Freezedのような記法でSharedPreferencesのデータを読み書きするクラスを自動生成
  • パラメーターの型やキーは予め定義されるのでタイプセーフに実装が可能
  • SharedPreferencesのインスタンスをキャッシュしておくためデータの取得が同期的に可能
  • ChangeNotifierを継承するため値の変更を検知してなにかしらの処理を行わせることが可能

例えば下記のような記述を行ないます。

@prefs
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});

  @override
  State<StatefulWidget> createState() => PrefsPageState();
}

class PrefsPageState extends State<PrefsPage> {

  @override
  void initState() {
    super.initState();
    prefs.addListener(() {
      setState(() {});
    });
    appPrefs.load();
  }

  @override
  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';

@prefs
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フィールドを監視することで終了を待つことも可能です。)

@override
void initState() {
  super.initState();
  appPrefs.load();
}

必要であればaddListenerで状態を監視することができます。

@override
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をお待ちしてます!

また仕事の依頼等ございましたら、私のTwitterWebサイトで直接ご連絡をお願いいたします!

FlutterやUnityを使ったアプリ開発やアプリの紹介。制作した楽曲・映像の紹介。画像や映像素材の配布。仕事の受注なども行っています。
https://mathru.nethttps://mathru.net
title

GitHub Sponsors

スポンサーを随時募集してます。ご支援お待ちしております!

Developed the katana/masamune framework, which has dramatically improved the overall efficiency of Flutter-based application development.
https://github.comhttps://github.com
title