Files
flutterApp/lib/core/theme/theme_cubit.dart
2026-08-18 08:52:33 +08:00

55 lines
1.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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