You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
2.1KB

  1. import 'dart:async';
  2. import 'package:bloc/bloc.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:farm_tpf/data/api/app_exception.dart';
  5. import 'package:farm_tpf/data/repository/repository.dart';
  6. import 'package:meta/meta.dart';
  7. part 'infinity_scroll_event.dart';
  8. part 'infinity_scroll_state.dart';
  9. class InfinityScrollBloc extends Bloc<InfinityScrollEvent, InfinityScrollState> {
  10. final Repository repository;
  11. InfinityScrollBloc({required this.repository}) : super(InfinityScrollInitial());
  12. static int pageSize = 20;
  13. @override
  14. Stream<InfinityScrollState> mapEventToState(
  15. InfinityScrollEvent event,
  16. ) async* {
  17. if (event is DataFetched && !(state is InfinityScrollSuccess && (state as InfinityScrollSuccess).hasReachedMax)) {
  18. try {
  19. if (state is InfinityScrollInitial) {
  20. final response = await repository.getInfinityList("url", page: 0, size: pageSize);
  21. yield InfinityScrollSuccess(items: response.results, page: 0, hasReachedMax: response.results.length < pageSize ? true : false);
  22. }
  23. if (state is InfinityScrollSuccess) {
  24. final currentState = state as InfinityScrollSuccess;
  25. int page = currentState.page + 1;
  26. final response = await repository.getInfinityList("url", page: page, size: pageSize);
  27. yield response.results.isEmpty
  28. ? currentState.copyWith(hasReachedMax: true)
  29. : InfinityScrollSuccess(items: currentState.items + response.results, page: currentState.page + 1, hasReachedMax: false);
  30. }
  31. } catch (e) {
  32. var errorString = AppException.handleError(e);
  33. yield InfinityScrollFailure(errorString: errorString);
  34. }
  35. }
  36. if (event is OnRefresh) {
  37. try {
  38. final response = await repository.getInfinityList("url", page: 0, size: pageSize);
  39. yield InfinityScrollSuccess(items: response.results, page: 0, hasReachedMax: response.results.length < pageSize ? true : false);
  40. } catch (e) {
  41. yield InfinityScrollFailure(errorString: AppException.handleError(e));
  42. }
  43. }
  44. }
  45. }