--- name: flutter-getx-state-management description: Implement reactive state with GetX controllers, bindings, and observables in Flutter. Use when managing app state with GetxController, Obx, GetBuilder, or dependency lifecycle—not unit tests for existing controllers. metadata: triggers: files: - '**_controller.dart' - '**/bindings/*.dart' keywords: - GetxController - Obx - GetBuilder - .obs - Get.put - Get.find - Get.lazyPut --- # GetX State Management ## **Priority: P0 (CRITICAL)** ## Structure ```text lib/app/modules/home/ ├── controllers/ │ └── home_controller.dart ├── bindings/ │ └── home_binding.dart └── views/ └── home_view.dart ``` ## Implementation Guidelines - **Controllers**: Extend `GetxController`. Store logic and state variables here. - **Reactivity**: - Use `.obs` for observable variables (e.g., `final count = 0.obs;`). - Wrap UI in `Obx(() => ...)` to listen for changes. - For simple state, use `update()` in controller and `GetBuilder` in UI. - **Dependency Injection**: - **Bindings**: Use `Bindings` class to decouple DI from UI. - **Lazy Load**: Prefer `Get.lazyPut(() => Controller())` in Bindings. - **Lifecycle**: Let GetX handle disposal. Avoid `permanent: true`. - **Hooks**: Use `onInit()`, `onReady()`, `onClose()` instead of `initState`/`dispose`. - **Architecture**: Use `get_cli` for modular MVVM (data, models, modules). ## Anti-Patterns - **Ctx in Logic**: Pass no `BuildContext` to controllers. - **Inline DI**: Avoid `Get.put()` in widgets; use Bindings + `Get.find`. - **Fat Views**: Keep views pure UI; delegate all logic to controller. ## Code Example See [references/controller-example.md](references/controller-example.md) for controller + view implementation pattern. ## Related Topics getx-navigation | layer-based-clean-architecture | dependency-injection ## Controller boundary - Keep `BuildContext` out of controllers. Use GetX services such as `Get.snackbar` for controller-owned feedback and expose reactive state to the view. ## Remediation anchors - Remediation anchors: onInit, Obx, no BuildContext in the controller