174 lines
4.4 KiB
Dart
174 lines
4.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import '../../core/utils/logger.dart';
|
|
|
|
/// 主题状态提供者
|
|
final themeProvider = StateNotifierProvider<ThemeNotifier, ThemeMode>((ref) {
|
|
return ThemeNotifier(ref);
|
|
});
|
|
|
|
/// 主题通知器
|
|
class ThemeNotifier extends StateNotifier<ThemeMode> with LoggerMixin {
|
|
final Ref ref;
|
|
|
|
ThemeNotifier(this.ref) : super(ThemeMode.system) {
|
|
_initializeTheme();
|
|
}
|
|
|
|
/// 初始化主题设置
|
|
Future<void> _initializeTheme() async {
|
|
logEnter('_initializeTheme');
|
|
|
|
try {
|
|
// 默认使用系统主题
|
|
state = ThemeMode.system;
|
|
logInfo('主题初始化完成: $state');
|
|
} catch (error, stackTrace) {
|
|
logError('主题初始化失败', error: error, stackTrace: stackTrace);
|
|
state = ThemeMode.system;
|
|
}
|
|
|
|
logExit('_initializeTheme');
|
|
}
|
|
|
|
/// 设置主题模式
|
|
Future<void> setThemeMode(ThemeMode themeMode) async {
|
|
logEnter('setThemeMode', {'themeMode': themeMode.toString()});
|
|
|
|
try {
|
|
if (state == themeMode) {
|
|
logInfo('主题模式未变化,跳过设置: $themeMode');
|
|
return;
|
|
}
|
|
|
|
state = themeMode;
|
|
|
|
logInfo('主题模式已更新: $themeMode');
|
|
} catch (error, stackTrace) {
|
|
logError('设置主题模式失败', error: error, stackTrace: stackTrace);
|
|
}
|
|
|
|
logExit('setThemeMode');
|
|
}
|
|
|
|
/// 切换主题模式
|
|
Future<void> toggleThemeMode() async {
|
|
logEnter('toggleThemeMode');
|
|
|
|
try {
|
|
final currentMode = state;
|
|
ThemeMode newMode;
|
|
|
|
switch (currentMode) {
|
|
case ThemeMode.system:
|
|
newMode = ThemeMode.light;
|
|
break;
|
|
case ThemeMode.light:
|
|
newMode = ThemeMode.dark;
|
|
break;
|
|
case ThemeMode.dark:
|
|
newMode = ThemeMode.system;
|
|
break;
|
|
}
|
|
|
|
await setThemeMode(newMode);
|
|
} catch (error, stackTrace) {
|
|
logError('切换主题模式失败', error: error, stackTrace: stackTrace);
|
|
}
|
|
|
|
logExit('toggleThemeMode');
|
|
}
|
|
|
|
/// 获取当前主题模式显示名称
|
|
String getCurrentThemeModeName() {
|
|
switch (state) {
|
|
case ThemeMode.system:
|
|
return '跟随系统';
|
|
case ThemeMode.light:
|
|
return '浅色模式';
|
|
case ThemeMode.dark:
|
|
return '深色模式';
|
|
}
|
|
}
|
|
|
|
/// 检查是否为深色模式
|
|
bool isDarkMode(BuildContext context) {
|
|
switch (state) {
|
|
case ThemeMode.system:
|
|
return MediaQuery.of(context).platformBrightness == Brightness.dark;
|
|
case ThemeMode.light:
|
|
return false;
|
|
case ThemeMode.dark:
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 主题模式扩展
|
|
extension ThemeModeExtension on ThemeMode {
|
|
/// 获取主题模式名称
|
|
String get name {
|
|
switch (this) {
|
|
case ThemeMode.system:
|
|
return '跟随系统';
|
|
case ThemeMode.light:
|
|
return '浅色模式';
|
|
case ThemeMode.dark:
|
|
return '深色模式';
|
|
}
|
|
}
|
|
|
|
/// 获取主题模式图标
|
|
IconData get icon {
|
|
switch (this) {
|
|
case ThemeMode.system:
|
|
return Icons.brightness_auto;
|
|
case ThemeMode.light:
|
|
return Icons.brightness_7;
|
|
case ThemeMode.dark:
|
|
return Icons.brightness_3;
|
|
}
|
|
}
|
|
|
|
/// 获取主题模式描述
|
|
String get description {
|
|
switch (this) {
|
|
case ThemeMode.system:
|
|
return '根据系统设置自动切换浅色和深色模式';
|
|
case ThemeMode.light:
|
|
return '始终使用浅色模式';
|
|
case ThemeMode.dark:
|
|
return '始终使用深色模式';
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 主题相关工具函数
|
|
class ThemeUtils {
|
|
/// 根据系统亮度获取推荐的主题模式
|
|
static ThemeMode getRecommendedThemeMode(Brightness brightness) {
|
|
return brightness == Brightness.dark ? ThemeMode.dark : ThemeMode.light;
|
|
}
|
|
|
|
/// 检查当前是否为深色模式
|
|
static bool isDarkMode(BuildContext context, ThemeMode themeMode) {
|
|
switch (themeMode) {
|
|
case ThemeMode.system:
|
|
return MediaQuery.of(context).platformBrightness == Brightness.dark;
|
|
case ThemeMode.light:
|
|
return false;
|
|
case ThemeMode.dark:
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/// 根据索引获取主题模式
|
|
static ThemeMode getThemeModeByIndex(int index) {
|
|
return ThemeMode.values[index.clamp(0, ThemeMode.values.length - 1)];
|
|
}
|
|
|
|
/// 根据主题模式获取索引
|
|
static int getIndexByThemeMode(ThemeMode themeMode) {
|
|
return ThemeMode.values.indexOf(themeMode);
|
|
}
|
|
} |