98 lines
2.5 KiB
Dart
98 lines
2.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
import 'theme_event.dart';
|
|
import 'theme_state.dart';
|
|
|
|
class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {
|
|
static const String themeKey = 'theme_mode';
|
|
|
|
ThemeBloc() : super(const ThemeState(themeMode: ThemeMode.system)) {
|
|
on<ThemeInitialize>(_onThemeInitialize);
|
|
on<ThemeChanged>(_onThemeChanged);
|
|
on<ThemeToggled>(_onThemeToggled);
|
|
}
|
|
|
|
Future<void> _onThemeInitialize(
|
|
ThemeInitialize event,
|
|
Emitter<ThemeState> emit,
|
|
) async {
|
|
emit(state.copyWith(isLoading: true));
|
|
|
|
try {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final themeModeString = prefs.getString(themeKey);
|
|
|
|
ThemeMode themeMode = ThemeMode.system;
|
|
if (themeModeString != null) {
|
|
switch (themeModeString) {
|
|
case 'light':
|
|
themeMode = ThemeMode.light;
|
|
break;
|
|
case 'dark':
|
|
themeMode = ThemeMode.dark;
|
|
break;
|
|
case 'system':
|
|
themeMode = ThemeMode.system;
|
|
break;
|
|
}
|
|
}
|
|
|
|
emit(state.copyWith(
|
|
themeMode: themeMode,
|
|
isLoading: false,
|
|
));
|
|
} catch (e) {
|
|
emit(state.copyWith(
|
|
themeMode: ThemeMode.system,
|
|
isLoading: false,
|
|
));
|
|
}
|
|
}
|
|
|
|
Future<void> _onThemeChanged(
|
|
ThemeChanged event,
|
|
Emitter<ThemeState> emit,
|
|
) async {
|
|
emit(state.copyWith(themeMode: event.themeMode));
|
|
|
|
try {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
String themeModeString;
|
|
switch (event.themeMode) {
|
|
case ThemeMode.light:
|
|
themeModeString = 'light';
|
|
break;
|
|
case ThemeMode.dark:
|
|
themeModeString = 'dark';
|
|
break;
|
|
case ThemeMode.system:
|
|
themeModeString = 'system';
|
|
break;
|
|
}
|
|
await prefs.setString(themeKey, themeModeString);
|
|
} catch (e) {
|
|
// 静默处理存储错误
|
|
}
|
|
}
|
|
|
|
Future<void> _onThemeToggled(
|
|
ThemeToggled event,
|
|
Emitter<ThemeState> emit,
|
|
) async {
|
|
ThemeMode newThemeMode;
|
|
switch (state.themeMode) {
|
|
case ThemeMode.light:
|
|
newThemeMode = ThemeMode.dark;
|
|
break;
|
|
case ThemeMode.dark:
|
|
newThemeMode = ThemeMode.system;
|
|
break;
|
|
case ThemeMode.system:
|
|
newThemeMode = ThemeMode.light;
|
|
break;
|
|
}
|
|
|
|
add(ThemeChanged(newThemeMode));
|
|
}
|
|
} |