import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:get/get.dart'; abstract class CommonListController extends CommonController { int page = 1; bool isEnd = false; bool? hasFooter; @override Rx?>> loadingState = LoadingState?>.loading().obs; void handleListResponse(List dataList) {} List? getDataList(R response) { return response as List?; } void checkIsEnd(int length) {} @override Future queryData([bool isRefresh = true]) async { if (isLoading || (!isRefresh && isEnd)) return; isLoading = true; LoadingState response = await customGetData(); if (response is Success) { if (!customHandleResponse(isRefresh, response)) { List? dataList = getDataList(response.response); if (dataList.isNullOrEmpty) { isEnd = true; if (isRefresh) { loadingState.value = Success(dataList); } else if (hasFooter == true) { loadingState.refresh(); } isLoading = false; return; } handleListResponse(dataList!); if (isRefresh) { checkIsEnd(dataList.length); loadingState.value = Success(dataList); } else if (loadingState.value is Success) { final list = loadingState.value.data!..addAll(dataList); checkIsEnd(list.length); loadingState.refresh(); } } page++; } else { if (isRefresh && !handleError(response is Error ? response.errMsg : null)) { loadingState.value = response as LoadingState?>; } } isLoading = false; } @override Future onRefresh() { page = 1; isEnd = false; return super.onRefresh(); } @override Future onReload() { loadingState.value = LoadingState?>.loading(); return super.onReload(); } }