theme work

This commit is contained in:
2026-04-05 10:06:26 +02:00
parent 0347a354ef
commit 28b2abdff3
16 changed files with 223 additions and 137 deletions

View File

@@ -1,17 +1,30 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:flux/data/enums.dart';
import 'package:get_it/get_it.dart';
import 'package:shared_preferences/shared_preferences.dart';
part 'theme_events.dart';
part 'theme_state.dart';
class ThemeBloc extends Bloc<ThemeEvent, ThemeState> {
final AppTheme initialAppTheme;
ThemeBloc({required this.initialAppTheme})
: super(
ThemeState(status: ThemeStatus.success, appTheme: initialAppTheme),
) {
static const String _savedThemeKey = "themeModeSetting";
final SharedPreferences _prefs = GetIt.I.get<SharedPreferences>();
ThemeBloc() : super(ThemeState(themeMode: ThemeMode.system)) {
on<LoadThemeEvent>((event, emit) {
String savedTheme = _prefs.getString(_savedThemeKey) ?? 'system';
emit(
state.copyWith(
themeMode: AppThemeMode.values
.firstWhere((test) => test.value == savedTheme)
.themeMode,
),
);
});
on<ChangeThemeEvent>((event, emit) async {
emit(state.copyWith(appTheme: event.appTheme));
await _prefs.setString(_savedThemeKey, event.appThemeMode.value);
emit(state.copyWith(themeMode: event.appThemeMode.themeMode));
});
}
}

View File

@@ -7,11 +7,13 @@ abstract class ThemeEvent extends Equatable {
List<Object> get props => [];
}
class ChangeThemeEvent extends ThemeEvent {
const ChangeThemeEvent({required this.appTheme});
final class LoadThemeEvent extends ThemeEvent {}
final AppTheme appTheme;
final class ChangeThemeEvent extends ThemeEvent {
final AppThemeMode appThemeMode;
const ChangeThemeEvent(this.appThemeMode);
@override
List<Object> get props => [appTheme];
List<Object> get props => [appThemeMode];
}

View File

@@ -1,30 +1,14 @@
part of 'theme_bloc.dart';
enum ThemeStatus { initial, success }
enum AppTheme {
dark(name: 'dark'),
light(name: 'light'),
system(name: 'system');
final String name;
const AppTheme({required this.name});
}
class ThemeState extends Equatable {
const ThemeState({required this.status, required this.appTheme});
const ThemeState({required this.themeMode});
final ThemeStatus status;
final AppTheme appTheme;
final ThemeMode themeMode;
@override
List<Object?> get props => [status, appTheme];
List<Object?> get props => [themeMode];
ThemeState copyWith({ThemeStatus? status, AppTheme? appTheme}) {
return ThemeState(
status: status ?? this.status,
appTheme: appTheme ?? this.appTheme,
);
ThemeState copyWith({ThemeMode? themeMode}) {
return ThemeState(themeMode: themeMode ?? this.themeMode);
}
}