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
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()}');
|
|
}
|
|
}
|
|
}
|
|
|