handlePagingEvent method
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));
}