Add pref utilities

This commit is contained in:
problematicconsumer
2023-09-01 14:55:15 +03:30
parent 6a2e359bbe
commit 1231fb363d
2 changed files with 36 additions and 14 deletions

View File

@@ -3,39 +3,52 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
class PrefNotifier<T> extends AutoDisposeNotifier<T> {
PrefNotifier(this._key, this._defaultValue);
PrefNotifier(this._key, this._defaultValue, this._mapFrom, this._mapTo);
final String _key;
final T _defaultValue;
final T Function(String)? _mapFrom;
final String Function(T)? _mapTo;
static AutoDisposeNotifierProvider<PrefNotifier<T>, T> provider<T>(
String key,
T defaultValue,
) =>
T defaultValue, {
T Function(String value)? mapFrom,
String Function(T value)? mapTo,
}) =>
NotifierProvider.autoDispose(
() => PrefNotifier(key, defaultValue),
() => PrefNotifier(key, defaultValue, mapFrom, mapTo),
);
SharedPreferences get _prefs => ref.read(sharedPreferencesProvider);
/// Updates the value asynchronously.
Future<void> update(T value) async {
if (value is String) {
await _prefs.setString(_key, value);
} else if (value is bool) {
await _prefs.setBool(_key, value);
} else if (value is int) {
await _prefs.setInt(_key, value);
} else if (value is double) {
await _prefs.setDouble(_key, value);
} else if (value is List<String>) {
await _prefs.setStringList(_key, value);
if (_mapTo != null && _mapFrom != null) {
await _prefs.setString(_key, _mapTo!(value));
} else {
switch (value) {
case String _:
await _prefs.setString(_key, value);
case bool _:
await _prefs.setBool(_key, value);
case int _:
await _prefs.setInt(_key, value);
case double _:
await _prefs.setDouble(_key, value);
case List<String> _:
await _prefs.setStringList(_key, value);
}
}
super.state = value;
}
@override
T build() {
if (_mapTo != null && _mapFrom != null) {
final persisted = _prefs.getString(_key);
return persisted != null ? _mapFrom!(persisted) : _defaultValue;
}
return _prefs.get(_key) as T? ?? _defaultValue;
}
}