feat: add base controllers for GetX state management
This commit is contained in:
25
lib/src/controllers/base/base_controller.dart
Normal file
25
lib/src/controllers/base/base_controller.dart
Normal 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 = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
38
lib/src/controllers/base/paged_controller.dart
Normal file
38
lib/src/controllers/base/paged_controller.dart
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user