くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutter x Riverpod x SharedPreferences

FlutterでRiverpodを使って、SharedPreferencesを使いたいなと思い、
いろいろ調べたときの備忘録(*´ω`*)

公式だとこの辺り

全体のサンプルを作ってくれている人がいたので、
こちらを参考にしつつ。

shared_preferencesのパッケージはこれ

全体の流れ

SharedPreferencesやFirebaseAppなど、非同期の初期化が必要だけど、
いろんなところで利用されているものがある。

それぞれのProviderで読み込んだり、エラー処理したりするのは冗長なので、
最初に一度だけ読み込み、Providerの値を上書きしてキャッシュする方法が提供されている。

SharedPreferences関連の処理

SharedPreferences周りの処理はこんな感じ。

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

// SharedPreferencesのインスタンスを保持するProvider
final sharedPreferencesProvider = Provider<SharedPreferences>((ref) {
  // あとで初期化したSharedPreferencesで上書きするため、
  // 未初期化時はErrorを返す
  throw UnimplementedError();
});

// SharedPreferencesを操作クラスを保持するプロバイダー
final sharedUtilityProvider = Provider<SharedUtility>((ref) {
  final sharedPrefs = ref.watch(sharedPreferencesProvider);
  return SharedUtility(sharedPreferences: sharedPrefs);
});


// SharedPreferencesを操作するクラス
const String sharedDarkModeKey = 'isDarkModeEnabled';
class SharedUtility {
  SharedUtility({
    required this.sharedPreferences,
  });

  final SharedPreferences sharedPreferences;

  bool isDarkModeEnabled() {
    return sharedPreferences.getBool(sharedDarkModeKey) ?? false;
  }

  void setDarkModeEnabled({required bool isdark}) {
    sharedPreferences.setBool(sharedDarkModeKey, isdark);
  }
}

初期化と上書きの部分

SharedPreferencesの初期化と上書きはこんな感じ。
overridesで、sharedPreferencesProviderの値を上書きしている。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // SharedPreferencesの初期化
  final sharedPreferences = await SharedPreferences.getInstance();

  return runApp(
    ProviderScope(
      overrides: [
        // 初期化したSharedPreferencesで上書き
        sharedPreferencesProvider.overrideWithValue(sharedPreferences),
      ],
      child: const SampleApp(),
    ),
  );
}

以上!! SharedPreferencesとFirebaseAppの例が出てたけど、
package_info_plusとかにも使えそう(*´ω`*)

参考にしたサイトさま