78 lines
2.1 KiB
Dart
78 lines
2.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
part 'settings_provider.g.dart';
|
|
|
|
@Riverpod(keepAlive: true)
|
|
Future<SharedPreferences> sharedPreferences(SharedPreferencesRef ref) =>
|
|
SharedPreferences.getInstance();
|
|
|
|
@riverpod
|
|
class ThemeModeNotifier extends _$ThemeModeNotifier {
|
|
static const _key = 'theme_mode';
|
|
|
|
@override
|
|
ThemeMode build() {
|
|
final prefs = ref.watch(sharedPreferencesProvider).valueOrNull;
|
|
final stored = prefs?.getString(_key);
|
|
return switch (stored) {
|
|
'light' => ThemeMode.light,
|
|
'dark' => ThemeMode.dark,
|
|
_ => ThemeMode.system,
|
|
};
|
|
}
|
|
|
|
Future<void> setThemeMode(ThemeMode mode) async {
|
|
final prefs = await ref.read(sharedPreferencesProvider.future);
|
|
await prefs.setString(_key, mode.name);
|
|
state = mode;
|
|
}
|
|
}
|
|
|
|
@riverpod
|
|
class LocaleNotifier extends _$LocaleNotifier {
|
|
static const _key = 'locale';
|
|
|
|
@override
|
|
Locale? build() {
|
|
final prefs = ref.watch(sharedPreferencesProvider).valueOrNull;
|
|
final stored = prefs?.getString(_key);
|
|
if (stored == null) return null; // use device locale
|
|
return Locale(stored);
|
|
}
|
|
|
|
Future<void> setLocale(Locale? locale) async {
|
|
final prefs = await ref.read(sharedPreferencesProvider.future);
|
|
if (locale == null) {
|
|
await prefs.remove(_key);
|
|
} else {
|
|
await prefs.setString(_key, locale.languageCode);
|
|
}
|
|
state = locale;
|
|
}
|
|
}
|
|
|
|
@riverpod
|
|
class QuickAccessCountNotifier extends _$QuickAccessCountNotifier {
|
|
static const _key = 'quick_access_count';
|
|
static const int minCount = 4;
|
|
static const int maxCount = 10;
|
|
static const int defaultCount = 6;
|
|
|
|
@override
|
|
int build() {
|
|
final prefs = ref.watch(sharedPreferencesProvider).valueOrNull;
|
|
final stored = prefs?.getInt(_key);
|
|
if (stored == null) return defaultCount;
|
|
return stored.clamp(minCount, maxCount);
|
|
}
|
|
|
|
Future<void> setCount(int count) async {
|
|
final clamped = count.clamp(minCount, maxCount);
|
|
final prefs = await ref.read(sharedPreferencesProvider.future);
|
|
await prefs.setInt(_key, clamped);
|
|
state = clamped;
|
|
}
|
|
}
|
|
|