From 7364ca2bc0fd0b476e29ee0bbf0bbc9519a135a7 Mon Sep 17 00:00:00 2001 From: Developer Date: Wed, 8 Apr 2026 01:29:42 +0800 Subject: [PATCH] feat: add base controllers for GetX state management --- lib/src/controllers/base/base_controller.dart | 25 ++++++++++++ .../controllers/base/paged_controller.dart | 38 +++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 lib/src/controllers/base/base_controller.dart create mode 100644 lib/src/controllers/base/paged_controller.dart diff --git a/lib/src/controllers/base/base_controller.dart b/lib/src/controllers/base/base_controller.dart new file mode 100644 index 0000000..76e427a --- /dev/null +++ b/lib/src/controllers/base/base_controller.dart @@ -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 runWithLoading(Future 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 = ''; + } +} diff --git a/lib/src/controllers/base/paged_controller.dart b/lib/src/controllers/base/paged_controller.dart new file mode 100644 index 0000000..40b41dd --- /dev/null +++ b/lib/src/controllers/base/paged_controller.dart @@ -0,0 +1,38 @@ +import 'package:get/get.dart'; +import 'package:mom_kitchen/src/controllers/base/base_controller.dart'; + +abstract class PagedController extends BaseController { + final items = [].obs; + final currentPage = 1.obs; + final hasMore = true.obs; + final pageSize = 20; + + Future> fetchPage(int page); + + Future 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 refresh() async { + currentPage.value = 1; + hasMore.value = true; + items.clear(); + await loadMore(); + } + + void clear() { + items.clear(); + currentPage.value = 1; + hasMore.value = true; + } +}