42 lines
1.1 KiB
Dart
42 lines
1.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
class ThemeNotifier extends Notifier<ThemeMode> {
|
|
static const _themePrefKey = 'theme_pref';
|
|
|
|
@override
|
|
ThemeMode build() {
|
|
_loadTheme();
|
|
return ThemeMode.system;
|
|
}
|
|
|
|
Future<void> _loadTheme() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final themeString = prefs.getString(_themePrefKey);
|
|
if (themeString != null) {
|
|
if (themeString == 'light') {
|
|
state = ThemeMode.light;
|
|
} else if (themeString == 'dark') {
|
|
state = ThemeMode.dark;
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> setTheme(ThemeMode mode) async {
|
|
state = mode;
|
|
final prefs = await SharedPreferences.getInstance();
|
|
if (mode == ThemeMode.light) {
|
|
await prefs.setString(_themePrefKey, 'light');
|
|
} else if (mode == ThemeMode.dark) {
|
|
await prefs.setString(_themePrefKey, 'dark');
|
|
} else {
|
|
await prefs.setString(_themePrefKey, 'system');
|
|
}
|
|
}
|
|
}
|
|
|
|
final themeProvider = NotifierProvider<ThemeNotifier, ThemeMode>(() {
|
|
return ThemeNotifier();
|
|
});
|