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(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 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 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 setCount(int count) async { final clamped = count.clamp(minCount, maxCount); final prefs = await ref.read(sharedPreferencesProvider.future); await prefs.setInt(_key, clamped); state = clamped; } }