43 lines
1.2 KiB
Dart
43 lines
1.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
/// Provider de thème — light / dark avec persistance
|
|
class ThemeProvider extends ChangeNotifier {
|
|
static const String _key = 'uf_theme_mode';
|
|
|
|
ThemeMode _mode;
|
|
|
|
ThemeProvider({ThemeMode initial = ThemeMode.system}) : _mode = initial;
|
|
|
|
ThemeMode get mode => _mode;
|
|
|
|
bool get isDark => _mode == ThemeMode.dark;
|
|
|
|
Future<void> toggle() async {
|
|
_mode = isDark ? ThemeMode.light : ThemeMode.dark;
|
|
notifyListeners();
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_key, _mode.name);
|
|
}
|
|
|
|
Future<void> setMode(ThemeMode mode) async {
|
|
if (_mode == mode) return;
|
|
_mode = mode;
|
|
notifyListeners();
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_key, mode.name);
|
|
}
|
|
|
|
/// Charge le thème persisté depuis les préférences
|
|
static Future<ThemeProvider> load() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final stored = prefs.getString(_key);
|
|
final mode = switch (stored) {
|
|
'light' => ThemeMode.light,
|
|
'dark' => ThemeMode.dark,
|
|
_ => ThemeMode.system,
|
|
};
|
|
return ThemeProvider(initial: mode);
|
|
}
|
|
}
|