55 lines
1.6 KiB
Dart
55 lines
1.6 KiB
Dart
|
|
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|