import 'package:flutter/material.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shared_preferences/shared_preferences.dart'; part 'theme_provider.g.dart'; /// User's theme preference setting. enum ThemeSetting { /// Follow system preference system, /// Always light mode light, /// Always dark mode dark, } /// Provider for theme setting state. @riverpod class ThemeNotifier extends _$ThemeNotifier { static const _prefsKey = 'theme_setting'; @override ThemeSetting build() { _loadSavedSetting(); return ThemeSetting.system; } Future _loadSavedSetting() async { final prefs = await SharedPreferences.getInstance(); final value = prefs.getString(_prefsKey); if (value != null) { try { state = ThemeSetting.values.byName(value); } catch (_) { // Invalid value, keep default } } } /// Update theme setting and persist to storage. Future setSetting(ThemeSetting setting) async { state = setting; final prefs = await SharedPreferences.getInstance(); await prefs.setString(_prefsKey, setting.name); } /// Get the ThemeMode for MaterialApp. ThemeMode get themeMode => switch (state) { ThemeSetting.system => ThemeMode.system, ThemeSetting.light => ThemeMode.light, ThemeSetting.dark => ThemeMode.dark, }; }