Flutter Clean Architecture下为各屏幕设独立GetxController及通信实现
在Flutter Clean Architecture下实现多GetxController通信(采购订单模块)
1. 拆分职责单一的控制器
为每个页面创建独立的GetxController,严格遵循单一职责原则:
PurchaseOrderListController:仅负责采购订单列表的加载、展示,响应筛选条件变更、新增订单后的刷新逻辑。PurchaseOrderFilterController:仅负责筛选条件的录入、保存、应用/重置操作。PurchaseOrderAddController:仅负责新增订单的表单校验、提交逻辑。
2. 基于Clean Architecture分层设计通信机制
2.1 定义Domain层的共享状态与用例
在Domain层创建响应式状态容器(如PurchaseOrderSharedState),封装全局共享的核心状态:
class PurchaseOrderSharedState { final Rx<FilterCriteria> currentFilters = FilterCriteria().obs; final RxList<PurchaseOrder> orderList = <PurchaseOrder>[].obs; final Rx<bool> isLoading = false.obs; }
同时在Domain层定义核心业务用例,所有状态变更必须通过用例触发(符合Clean Architecture业务逻辑内聚的要求):
LoadOrdersByFiltersUseCase:根据传入的筛选条件加载订单列表,更新PurchaseOrderSharedState中的orderList。ApplyFiltersUseCase:接收筛选条件,更新PurchaseOrderSharedState的currentFilters,并自动调用LoadOrdersByFiltersUseCase刷新列表。AddPurchaseOrderUseCase:提交新订单,成功后将新增订单插入PurchaseOrderSharedState的orderList(或触发全量刷新)。ResetFiltersUseCase:重置currentFilters为默认值,调用LoadOrdersByFiltersUseCase刷新列表。
2.2 控制器依赖Domain层实现通信
所有控制器通过Getx的依赖注入(Get.put()/Get.find())获取PurchaseOrderSharedState和对应用例,避免控制器之间直接依赖:
PurchaseOrderListController:
监听PurchaseOrderSharedState中的orderList和isLoading,初始化时调用用例加载数据;提供重置筛选的方法,内部调用对应用例:class PurchaseOrderListController extends GetxController { final PurchaseOrderSharedState _sharedState = Get.find(); final LoadOrdersByFiltersUseCase _loadUseCase = Get.find(); final ResetFiltersUseCase _resetFiltersUseCase = Get.find(); @override void onInit() { super.onInit(); _loadUseCase.execute(_sharedState.currentFilters.value); } void resetFilters() { _resetFiltersUseCase.execute(); } }页面通过
Obx(() => ...)监听_sharedState.orderList自动刷新UI。PurchaseOrderFilterController:
维护本地临时筛选状态,用户确认时调用用例将临时状态同步到全局共享状态:class PurchaseOrderFilterController extends GetxController { final FilterCriteria _tempFilters = FilterCriteria(); final ApplyFiltersUseCase _applyFiltersUseCase = Get.find(); void onFilterConfirmed() { _applyFiltersUseCase.execute(_tempFilters); Get.back(); } }PurchaseOrderAddController:
处理表单提交,调用新增用例,成功后由用例更新全局订单列表,列表页面自动监听刷新:class PurchaseOrderAddController extends GetxController { final AddPurchaseOrderUseCase _addUseCase = Get.find(); final PurchaseOrderForm form = PurchaseOrderForm(); Future<void> submitOrder() async { if (form.validate()) { await _addUseCase.execute(form.toPurchaseOrder()); Get.back(); } } }
3. 核心注意事项
- 禁止控制器通过
Get.find<OtherController>()直接调用其他控制器的方法,所有状态变更必须通过Domain层用例触发,确保依赖方向符合Clean Architecture(UI层依赖Domain层,而非UI层内部互相依赖)。 - 共享状态仅在Domain层维护,控制器仅作为状态消费者和用例调用者,不直接修改状态。
内容的提问来源于stack exchange,提问作者ASAD HAMEED
相关产品推荐
相关产品推荐

