You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.8 KiB

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import '../utils/logger.dart';
class ThemeService {
final _box = GetStorage();
// 旧版布尔键,兼容历史数据
final _key = 'isDarkMode';
// 新版字符串键,支持系统跟随/深色/浅色
final _modeKey = 'themeModePreference';
/// 获取主题模式(优先读取新版字符串偏好;否则回退到旧版布尔值;都没有则跟随系统)
ThemeMode getThemeMode() {
try {
final String? pref = _box.read<String>(_modeKey);
if (pref != null) {
switch (pref) {
case 'system':
Logger.info('获取保存的主题: 系统跟随');
return ThemeMode.system;
case 'dark':
Logger.info('获取保存的主题: 暗黑');
return ThemeMode.dark;
case 'light':
Logger.info('获取保存的主题: 浅色');
return ThemeMode.light;
}
}
// 回退读取旧版布尔值
final isDarkMode = isSavedDarkMode();
if (_box.hasData(_key)) {
Logger.info('获取保存的主题(兼容旧版): ${isDarkMode ? "暗黑" : "浅色"}');
return isDarkMode ? ThemeMode.dark : ThemeMode.light;
}
// 默认系统跟随
Logger.info('未发现主题偏好,默认系统跟随');
return ThemeMode.system;
} catch (e) {
Logger.error('读取主题模式失败: ${e.toString()}');
return ThemeMode.system;
}
}
/// 是否是暗黑模式(兼容旧逻辑)
bool isSavedDarkMode() {
try {
final value = _box.read<bool>(_key);
Logger.info('从存储读取旧版主题设置: $value');
return value ?? false;
} catch (e) {
Logger.error('读取旧版主题设置失败: ${e.toString()}');
return false;
}
}
/// 保存主题模式到本地存储(兼容旧方法,同时写入新版字符串键)
Future<void> saveThemeMode(bool isDarkMode) async {
try {
Logger.info('保存主题设置: ${isDarkMode ? "暗黑" : "浅色"}');
await _box.write(_key, isDarkMode);
await _box.write(_modeKey, isDarkMode ? 'dark' : 'light');
} catch (e) {
Logger.error('保存主题设置失败: ${e.toString()}');
}
}
/// 新版:显式保存主题模式(system/dark/light)
Future<void> saveThemeModePreference(ThemeMode mode) async {
try {
final String value = mode == ThemeMode.system
? 'system'
: (mode == ThemeMode.dark ? 'dark' : 'light');
Logger.info('保存主题偏好(新版): $value');
await _box.write(_modeKey, value);
// 同步旧键,保持兼容
await _box.write(_key, mode == ThemeMode.dark);
} catch (e) {
Logger.error('保存主题偏好失败: ${e.toString()}');
}
}
}