Files
PiliPlus/lib/pages/common/common_controller.dart
bggRGjQaUbCoE 418a1e8d39 reformat
Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
2025-07-23 16:47:11 +08:00

70 lines
1.4 KiB
Dart

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<void> onRefresh();
void toTopOrRefresh() {
if (scrollController.hasClients) {
if (scrollController.position.pixels == 0) {
EasyThrottle.throttle(
'topOrRefresh',
const Duration(milliseconds: 500),
onRefresh,
);
} else {
animateToTop();
}
}
}
}
abstract class CommonController<R, T> extends GetxController
with ScrollOrRefreshMixin {
@override
final ScrollController scrollController = ScrollController();
bool isLoading = false;
Rx<LoadingState> get loadingState;
Future<LoadingState<R>> customGetData();
Future<void> queryData([bool isRefresh = true]);
bool customHandleResponse(bool isRefresh, Success<R> response) {
return false;
}
bool handleError(String? errMsg) {
return false;
}
@override
Future<void> onRefresh() {
return queryData();
}
Future<void> onLoadMore() {
return queryData(false);
}
Future<void> onReload() {
return onRefresh();
}
@override
void onClose() {
scrollController.dispose();
super.onClose();
}
}