PMU_PIbd32_Kamcharova_K.A/lib/bloc/bloc.dart

67 lines
2.2 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter_bloc/flutter_bloc.dart';
import 'events.dart';
import 'state.dart';
import '../utils/character_service.dart';
import '../models/character.dart';
import 'dart:async';
class DebouncedSearchCubit extends Cubit<String> {
DebouncedSearchCubit() : super('');
Timer? _debounce;
// Метод для обновления поиска с задержкой
void search(String query) {
if (_debounce?.isActive ?? false) _debounce?.cancel();
_debounce = Timer(const Duration(milliseconds: 500), () {
emit(query);
});
}
@override
Future<void> close() {
_debounce?.cancel();
return super.close();
}
}
class HomeBloc extends Bloc<HomeEvent, HomeState> {
final CharacterService characterService;
HomeBloc(this.characterService) : super(const HomeState()) {
on<HomeLoadDataEvent>(_onLoadData);
on<HomeSearchEvent>(_onSearchCharacters); // Добавлен новый обработчик для поиска
}
// Загрузка данных
Future<void> _onLoadData(HomeLoadDataEvent event, Emitter<HomeState> emit) async {
emit(state.copyWith(status: HomeStatus.loading));
try {
// Получаем список объектов CharacterDTO
final charactersDTO = await characterService.getCharacters(search: event.searchQuery);
// Преобразуем список Character в список CharacterDTO
final charactersAsDTO = charactersDTO.map((character) => character.toDTO()).toList();
emit(state.copyWith(status: HomeStatus.loaded, characters: charactersAsDTO)); // Передаем в emit
} catch (e) {
print('Error: $e');
emit(state.copyWith(status: HomeStatus.error, errorMessage: e.toString()));
}
}
// Логика поиска
void _onSearchCharacters(HomeSearchEvent event, Emitter<HomeState> emit) {
final query = event.query.toLowerCase();
// Фильтруем данные по запросу
final filteredCharacters = state.characters
.where((character) => character.name.toLowerCase().contains(query))
.toList();
// Обновляем состояние с отфильтрованными данными
emit(state.copyWith(status: HomeStatus.loaded, characters: filteredCharacters));
}
}