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 initialize() async { final value = (await SharedPreferences.getInstance()).getString(_key); _preference = JzThemePreference.values.firstWhere( (item) => item.name == value, orElse: () => JzThemePreference.system, ); await _syncNativeTheme(); } Future setPreference(JzThemePreference value) async { if (_preference == value) return; _preference = value; notifyListeners(); await (await SharedPreferences.getInstance()).setString(_key, value.name); await _syncNativeTheme(); } Future _syncNativeTheme() async { try { await _channel.invokeMethod('setThemeMode', { 'mode': _preference.name, }); } on MissingPluginException { // Native startup themes are Android-only. } } }