import 'dart:async'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/utils/extension.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; mixin ScrollOrRefreshMixin { ScrollController get scrollController; void animateToTop() => scrollController.animToTop(); Future onRefresh(); void toTopOrRefresh() { if (scrollController.hasClients) { if (scrollController.position.pixels == 0) { EasyThrottle.throttle( 'topOrRefresh', const Duration(milliseconds: 500), onRefresh, ); } else { animateToTop(); } } } } abstract class CommonController extends GetxController with ScrollOrRefreshMixin { @override final ScrollController scrollController = ScrollController(); bool isLoading = false; Rx get loadingState; Future> customGetData(); Future queryData([bool isRefresh = true]); bool customHandleResponse(bool isRefresh, Success response) { return false; } bool handleError(String? errMsg) { return false; } @override Future onRefresh() { return queryData(); } Future onLoadMore() { return queryData(false); } Future onReload() { return onRefresh(); } @override void onClose() { scrollController.dispose(); super.onClose(); } }