Fix import paths and test issues

- Fixed test file import paths to point to correct Bloc file locations
- Fixed Bloc file import paths for models (../../../models/models.dart)
- Added explicit type annotations to resolve null safety warnings
- Fixed null safety issues in wishlist_bloc_test.dart
- All 70 tests now passing
This commit is contained in:
Yuriy Panov
2026-02-04 15:28:59 +06:00
parent 310463e89a
commit 2f97873095
46 changed files with 270 additions and 260 deletions

View File

@@ -0,0 +1,39 @@
import 'package:flutter_bloc/flutter_bloc.dart';
import 'settings_event.dart';
import 'settings_state.dart';
class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
SettingsBloc() : super(SettingsState.initial()) {
on<LoadSettings>(_onLoadSettings);
on<UpdateTheme>(_onUpdateTheme);
on<UpdateLanguage>(_onUpdateLanguage);
on<ToggleNotifications>(_onToggleNotifications);
on<ClearData>(_onClearData);
}
void _onLoadSettings(LoadSettings event, Emitter<SettingsState> emit) {
emit(state.copyWith(
isDarkMode: false,
language: 'English',
notificationsEnabled: true,
isLoading: false,
));
}
void _onUpdateTheme(UpdateTheme event, Emitter<SettingsState> emit) {
emit(state.copyWith(isDarkMode: event.isDarkMode));
}
void _onUpdateLanguage(UpdateLanguage event, Emitter<SettingsState> emit) {
emit(state.copyWith(language: event.language));
}
void _onToggleNotifications(
ToggleNotifications event, Emitter<SettingsState> emit) {
emit(state.copyWith(notificationsEnabled: !state.notificationsEnabled));
}
void _onClearData(ClearData event, Emitter<SettingsState> emit) {
emit(state.copyWith(dataCleared: true));
}
}

View File

@@ -0,0 +1,25 @@
abstract class SettingsEvent {
const SettingsEvent();
}
class LoadSettings extends SettingsEvent {
const LoadSettings();
}
class UpdateTheme extends SettingsEvent {
final bool isDarkMode;
const UpdateTheme(this.isDarkMode);
}
class UpdateLanguage extends SettingsEvent {
final String language;
const UpdateLanguage(this.language);
}
class ToggleNotifications extends SettingsEvent {
const ToggleNotifications();
}
class ClearData extends SettingsEvent {
const ClearData();
}

View File

@@ -0,0 +1,53 @@
import 'package:equatable/equatable.dart';
class SettingsState extends Equatable {
final bool isDarkMode;
final String language;
final bool notificationsEnabled;
final bool dataCleared;
final bool isLoading;
final String? errorMessage;
const SettingsState({
this.isDarkMode = false,
this.language = 'English',
this.notificationsEnabled = true,
this.dataCleared = false,
this.isLoading = false,
this.errorMessage,
});
factory SettingsState.initial() {
return const SettingsState(
isLoading: true,
);
}
SettingsState copyWith({
bool? isDarkMode,
String? language,
bool? notificationsEnabled,
bool? dataCleared,
bool? isLoading,
String? errorMessage,
}) {
return SettingsState(
isDarkMode: isDarkMode ?? this.isDarkMode,
language: language ?? this.language,
notificationsEnabled: notificationsEnabled ?? this.notificationsEnabled,
dataCleared: dataCleared ?? this.dataCleared,
isLoading: isLoading ?? this.isLoading,
errorMessage: errorMessage ?? this.errorMessage,
);
}
@override
List<Object?> get props => [
isDarkMode,
language,
notificationsEnabled,
dataCleared,
isLoading,
errorMessage,
];
}

View File

@@ -0,0 +1,39 @@
import 'package:flutter/material.dart';
class SettingsScreen extends StatelessWidget {
const SettingsScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF112116),
body: Center(
child: Padding(
padding: const EdgeInsets.all(40),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'Настройки',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(height: 8),
Text(
'Персонализируйте ваше приложение.',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 16,
color: const Color(0xFF93C8A5),
),
),
],
),
),
),
);
}
}