handlePagingEvent method

  1. @protected
Future<void> handlePagingEvent(
  1. BasePagingEvent<Q> event,
  2. Emitter<BaseState> emit
)

Implementation

@protected
Future<void> handlePagingEvent(
  BasePagingEvent<Q> event,
  Emitter<BaseState> emit,
) async {
  // Check if all data is loaded
  final isFirstRequest = event.isFirstRequest;
  if (!isFirstRequest && _loadedAllData) {
    return;
  }
  // Check conditions
  if (pagingQueryNeedCheckConnection) {
    await checkConnection();
    // Add other conditions in the future
  }
  if (isFirstRequest) {
    reset();
  }

  // After that, start paging request
  final tag = event.tag;
  if (event.needLoading) {
    emit(BaseLoadingState(tag: tag));
  }
  final responsePaging = await cancelableFuture(
    pagingInProgress(
      BaseRequestPaging<Q>(
        queryData: event.queryData,
        limit: event.limit,
        offset: _currentOffset,
      ),
    ),
    tag: tag,
    // Already checked connection
    needCheckConnection: false,
    // Need rethrow here to spread out to outer layer
    needHandleError: false,
  );
  if (responsePaging is! BaseResponsePaging<D>) {
    throw const KntException(KntIssue.parsing);
  }
  final dataList = responsePaging.dataList;
  if (dataList.length < event.limit) {
    // Reached last page if result has less than limit
    _loadedAllData = true;
  }
  if (dataList.isEmpty && isFirstRequest) {
    // In case at first paging request we have empty data, we could stop
    emit(BaseEmptyResultState(tag: tag));
    return;
  }
  // Update data list and offset
  _dataList.addAll(dataList.where((element) => element != null));
  if (responsePaging.currentOffset == defaultInvalidOffset) {
    _currentOffset += dataList.length;
  } else {
    _currentOffset = responsePaging.currentOffset;
  }
  // Sorting
  await _sort();
  // Show state
  emit(pagingStateInstance(_dataList, _currentOffset, tag: tag));
}