43 lines
1.1 KiB
Dart
43 lines
1.1 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
const _themeModeKey = 'theme_mode';
|
|
|
|
final themeModeProvider = StateNotifierProvider<ThemeModeController, ThemeMode>(
|
|
(ref) => ThemeModeController(),
|
|
);
|
|
|
|
class ThemeModeController extends StateNotifier<ThemeMode> {
|
|
ThemeModeController() : super(ThemeMode.system) {
|
|
unawaited(_loadSavedMode());
|
|
}
|
|
|
|
Future<void> _loadSavedMode() async {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final raw = prefs.getString(_themeModeKey);
|
|
if (raw == null) return;
|
|
state = _decode(raw);
|
|
}
|
|
|
|
Future<void> setMode(ThemeMode mode) async {
|
|
state = mode;
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_themeModeKey, _encode(mode));
|
|
}
|
|
|
|
ThemeMode _decode(String raw) => switch (raw) {
|
|
'light' => ThemeMode.light,
|
|
'dark' => ThemeMode.dark,
|
|
_ => ThemeMode.system,
|
|
};
|
|
|
|
String _encode(ThemeMode mode) => switch (mode) {
|
|
ThemeMode.light => 'light',
|
|
ThemeMode.dark => 'dark',
|
|
ThemeMode.system => 'system',
|
|
};
|
|
}
|