import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/utils/logger.dart'; /// 主题状态提供者 final themeProvider = StateNotifierProvider((ref) { return ThemeNotifier(ref); }); /// 主题通知器 class ThemeNotifier extends StateNotifier with LoggerMixin { final Ref ref; ThemeNotifier(this.ref) : super(ThemeMode.system) { _initializeTheme(); } /// 初始化主题设置 Future _initializeTheme() async { logEnter('_initializeTheme'); try { // 默认使用系统主题 state = ThemeMode.system; logInfo('主题初始化完成: $state'); } catch (error, stackTrace) { logError('主题初始化失败', error: error, stackTrace: stackTrace); state = ThemeMode.system; } logExit('_initializeTheme'); } /// 设置主题模式 Future 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 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); } }