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 { DebouncedSearchCubit() : super(''); Timer? _debounce; // Метод для обновления поиска с задержкой void search(String query) { if (_debounce?.isActive ?? false) _debounce?.cancel(); _debounce = Timer(const Duration(milliseconds: 500), () { emit(query); }); } @override Future close() { _debounce?.cancel(); return super.close(); } } class HomeBloc extends Bloc { final CharacterService characterService; HomeBloc(this.characterService) : super(const HomeState()) { on(_onLoadData); on(_onSearchCharacters); // Добавлен новый обработчик для поиска } // Загрузка данных Future _onLoadData(HomeLoadDataEvent event, Emitter 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 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)); } }