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