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