马良AI写作初始化仓库
This commit is contained in:
98
AINoval/lib/blocs/theme/theme_bloc.dart
Normal file
98
AINoval/lib/blocs/theme/theme_bloc.dart
Normal file
@@ -0,0 +1,98 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user