马良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));
|
||||
}
|
||||
}
|
||||
13
AINoval/lib/blocs/theme/theme_event.dart
Normal file
13
AINoval/lib/blocs/theme/theme_event.dart
Normal file
@@ -0,0 +1,13 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
abstract class ThemeEvent {}
|
||||
|
||||
class ThemeInitialize extends ThemeEvent {}
|
||||
|
||||
class ThemeChanged extends ThemeEvent {
|
||||
final ThemeMode themeMode;
|
||||
|
||||
ThemeChanged(this.themeMode);
|
||||
}
|
||||
|
||||
class ThemeToggled extends ThemeEvent {}
|
||||
25
AINoval/lib/blocs/theme/theme_state.dart
Normal file
25
AINoval/lib/blocs/theme/theme_state.dart
Normal file
@@ -0,0 +1,25 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class ThemeState {
|
||||
final ThemeMode themeMode;
|
||||
final bool isLoading;
|
||||
|
||||
const ThemeState({
|
||||
required this.themeMode,
|
||||
this.isLoading = false,
|
||||
});
|
||||
|
||||
ThemeState copyWith({
|
||||
ThemeMode? themeMode,
|
||||
bool? isLoading,
|
||||
}) {
|
||||
return ThemeState(
|
||||
themeMode: themeMode ?? this.themeMode,
|
||||
isLoading: isLoading ?? this.isLoading,
|
||||
);
|
||||
}
|
||||
|
||||
bool get isDarkMode => themeMode == ThemeMode.dark;
|
||||
bool get isLightMode => themeMode == ThemeMode.light;
|
||||
bool get isSystemMode => themeMode == ThemeMode.system;
|
||||
}
|
||||
Reference in New Issue
Block a user