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.

66 lines
2.3KB

  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
  10. extends Bloc<InfinityScrollEvent, InfinityScrollState> {
  11. final Repository repository;
  12. InfinityScrollBloc({@required this.repository})
  13. : super(InfinityScrollInitial());
  14. static int pageSize = 20;
  15. @override
  16. Stream<InfinityScrollState> mapEventToState(
  17. InfinityScrollEvent event,
  18. ) async* {
  19. if (event is DataFetched &&
  20. !(state is InfinityScrollSuccess &&
  21. (state as InfinityScrollSuccess).hasReachedMax)) {
  22. try {
  23. if (state is InfinityScrollInitial) {
  24. final response =
  25. await repository.getInfinityList("url", page: 0, size: pageSize);
  26. yield InfinityScrollSuccess(
  27. items: response.results,
  28. page: 0,
  29. hasReachedMax: response.results.length < pageSize ? true : false);
  30. }
  31. if (state is InfinityScrollSuccess) {
  32. final currentState = state as InfinityScrollSuccess;
  33. int page = currentState.page + 1;
  34. final response = await repository.getInfinityList("url",
  35. page: page, size: pageSize);
  36. yield response.results.isEmpty
  37. ? currentState.copyWith(hasReachedMax: true)
  38. : InfinityScrollSuccess(
  39. items: currentState.items + response.results,
  40. page: currentState.page + 1,
  41. hasReachedMax: false);
  42. }
  43. } catch (e) {
  44. var errorString = AppException.handleError(e);
  45. yield InfinityScrollFailure(errorString: errorString);
  46. }
  47. }
  48. if (event is OnRefresh) {
  49. try {
  50. final response =
  51. await repository.getInfinityList("url", page: 0, size: pageSize);
  52. yield InfinityScrollSuccess(
  53. items: response.results,
  54. page: 0,
  55. hasReachedMax: response.results.length < pageSize ? true : false);
  56. } catch (e) {
  57. yield InfinityScrollFailure(errorString: AppException.handleError(e));
  58. }
  59. }
  60. }
  61. }