snap_wish/lib/presentation/providers/theme_provider.dart
2025-09-12 18:17:35 +08:00

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