51 lines
1.5 KiB
Dart
51 lines
1.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
enum JzThemePreference { system, light, dark }
|
|
|
|
class ThemeStore extends ChangeNotifier {
|
|
ThemeStore._();
|
|
|
|
static final instance = ThemeStore._();
|
|
static const _key = 'theme_preference';
|
|
static const _channel = MethodChannel('com.miaoji/screenshot');
|
|
|
|
JzThemePreference _preference = JzThemePreference.system;
|
|
|
|
JzThemePreference get preference => _preference;
|
|
|
|
ThemeMode get themeMode => switch (_preference) {
|
|
JzThemePreference.light => ThemeMode.light,
|
|
JzThemePreference.dark => ThemeMode.dark,
|
|
JzThemePreference.system => ThemeMode.system,
|
|
};
|
|
|
|
Future<void> initialize() async {
|
|
final value = (await SharedPreferences.getInstance()).getString(_key);
|
|
_preference = JzThemePreference.values.firstWhere(
|
|
(item) => item.name == value,
|
|
orElse: () => JzThemePreference.system,
|
|
);
|
|
await _syncNativeTheme();
|
|
}
|
|
|
|
Future<void> setPreference(JzThemePreference value) async {
|
|
if (_preference == value) return;
|
|
_preference = value;
|
|
notifyListeners();
|
|
await (await SharedPreferences.getInstance()).setString(_key, value.name);
|
|
await _syncNativeTheme();
|
|
}
|
|
|
|
Future<void> _syncNativeTheme() async {
|
|
try {
|
|
await _channel.invokeMethod<bool>('setThemeMode', {
|
|
'mode': _preference.name,
|
|
});
|
|
} on MissingPluginException {
|
|
// Native startup themes are Android-only.
|
|
}
|
|
}
|
|
}
|