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とかにも使えそう(*´ω`*)