feat: add base controllers for GetX state management

This commit is contained in:
Developer
2026-04-08 01:29:42 +08:00
commit 7364ca2bc0
2 changed files with 63 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
import 'package:get/get.dart';
import 'package:mom_kitchen/src/services/app_service.dart';
import 'package:mom_kitchen/src/utils/app_logger.dart';
abstract class BaseController extends GetxController {
final isLoading = false.obs;
final errorMessage = ''.obs;
Future<void> runWithLoading(Future<void> Function() action) async {
isLoading.value = true;
errorMessage.value = '';
try {
await action();
} catch (e) {
errorMessage.value = e.toString();
AppLogger.e('Controller error: $e');
} finally {
isLoading.value = false;
}
}
void clearError() {
errorMessage.value = '';
}
}

View File

@@ -0,0 +1,38 @@
import 'package:get/get.dart';
import 'package:mom_kitchen/src/controllers/base/base_controller.dart';
abstract class PagedController<T> extends BaseController {
final items = <T>[].obs;
final currentPage = 1.obs;
final hasMore = true.obs;
final pageSize = 20;
Future<List<T>> fetchPage(int page);
Future<void> loadMore() async {
if (!hasMore.value || isLoading.value) return;
await runWithLoading(() async {
final newItems = await fetchPage(currentPage.value + 1);
if (newItems.isEmpty) {
hasMore.value = false;
} else {
items.addAll(newItems);
currentPage.value++;
}
});
}
Future<void> refresh() async {
currentPage.value = 1;
hasMore.value = true;
items.clear();
await loadMore();
}
void clear() {
items.clear();
currentPage.value = 1;
hasMore.value = true;
}
}