You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:35:20