Files
flutterApp/lib/core/theme/theme_cubit.dart

55 lines
1.6 KiB
Dart
Raw Normal View History

2026-08-18 08:52:33 +08:00
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:shared_preferences/shared_preferences.dart';
/// 全局主题管理 Cubit(仿 LocaleCubit 模式)
/// 支持 light / dark / system 三态,持久化到 SharedPreferences
class ThemeCubit extends Cubit<ThemeMode> {
static const String _themeKey = 'app_theme_mode';
ThemeCubit() : super(ThemeMode.light) {
_loadSavedThemeMode();
}
/// 从本地存储恢复上次保存的主题模式
Future<void> _loadSavedThemeMode() async {
try {
final prefs = await SharedPreferences.getInstance();
final saved = prefs.getString(_themeKey);
emit(_parseThemeMode(saved));
} catch (e) {
emit(ThemeMode.light);
}
}
/// 设置主题模式并持久化
Future<void> setThemeMode(ThemeMode mode) async {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_themeKey, mode.name);
emit(mode);
} catch (e) {
debugPrint('❌ [ThemeCubit] 保存主题设置失败: $e');
}
}
/// 夜间模式开关(Switch 二态切换,不涉及跟随系统)
Future<void> toggleDarkMode(bool enabled) =>
setThemeMode(enabled ? ThemeMode.dark : ThemeMode.light);
/// 当前是否为深色模式
bool get isDarkMode => state == ThemeMode.dark;
/// 将持久化的字符串解析为 ThemeMode
ThemeMode _parseThemeMode(String? saved) {
switch (saved) {
case 'dark':
return ThemeMode.dark;
case 'system':
return ThemeMode.system;
default:
return ThemeMode.light;
}
}
}