The architecture used in this project is GetX Architecture, which organizes the codebase into three core layers:
Each module in the project follows a consistent three-layer structure:
Bindings: Handles dependency injection. Each screen has a binding class that registers its controller before the view is loaded, ensuring everything is available when needed.
Controllers: The brain of each screen. Controllers manage state, business logic, and interactions with services. They extend GetxController and expose reactive variables that the view observes.
Views: Pure UI. Views observe the controller's state and rebuild only when relevant data changes. They contain no business logic.
Every module under lib/app/modules/ follows this pattern:
module_name/
βββ bindings/ # Dependency injection
βββ controllers/ # State & business logic
βββ views/ # UI widgets
- Views should never directly call services; always go through the controller.
- Views should contain zero business logic; only render what the controller exposes.
- Controllers should not depend on other controllers.
- Controllers may be reused across views if they share the same functionality.
- Services are globally accessible and shared across all controllers.
Since services are global, a multi-screen app shares them while each screen gets its own controller and view:
lib/
βββ app/
β βββ models/
β βββ modules/
β β βββ about/
β β βββ detailRoute/
β β βββ home/
β β βββ logs/
β β βββ manageTaskServer/
β β βββ manage_task_champion_creds/
β β βββ onboarding/
β β βββ permission/
β β βββ profile/
β β βββ reports/
β β βββ settings/
β β βββ splash/
β β βββ taskc_details/
β βββ routes/
β βββ services/
β βββ tour/
β βββ utils/
β β βββ add_task_dialogue/
β β βββ app_settings/
β β βββ constants/
β β βββ debug_logger/
β β βββ gen/
β β βββ home_path/
β β βββ language/
β β βββ permissions/
β β βββ taskc/
β β βββ taskchampion/
β β βββ taskfunctions/
β β βββ taskserver/
β β βββ themes/
β βββ v3/
β βββ champion/
β βββ db/
β βββ models/
β βββ net/
βββ rust_bridge/
βββ main.dart

