# Flutter GetX Navigation

> Context-less navigation, named routes, and middleware using GetX.

- Skill: `ngxtm-devkit/flutter-getx-navigation` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add ngxtm-devkit/flutter-getx-navigation`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ngxtm-devkit/flutter-getx-navigation/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: ngxtm (https://skillmd.com/u/ngxtm-devkit)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ngxtm-devkit/flutter-getx-navigation

---


# GetX Navigation

## **Priority: P0 (CRITICAL)**

Decoupled navigation system allowing UI transitions without `BuildContext`.

## Implementation Guidelines

- **Prefer Named Routes**: Use `Get.toNamed('/path')` for better maintainability. Define routes in a centralized `AppPages` class.
- **No Context Navigation**: Leverage `Get.to()`, `Get.back()`, etc., directly from controllers.
- **Navigation Methods**:
  - `Get.to()`: Navigate to next screen.
  - `Get.off()`: Navigate and replace current screen (e.g., Splash -> Home).
  - `Get.offAll()`: Clear stack and navigate (e.g., Logout -> Login).
  - `Get.back()`: Close current screen, dialog, or bottom sheet.
- **Bindings Everywhere**: Always link routes with `Bindings` to manage controller lifecycles.
- **Middleware**: Use `GetMiddleware` for route guards (Auth, Permissions) instead of logic inside views.

## Code Example

```dart
// Route Definition
static final routes = [
  GetPage(
    name: _Paths.HOME,
    page: () => HomeView(),
    binding: HomeBinding(),
    middlewares: [AuthMiddleware()],
  ),
];

// Usage in Controller
void logout() {
  _authService.clear();
  Get.offAllNamed(Routes.LOGIN);
}

// Route Guard
class AuthMiddleware extends GetMiddleware {
  @override
  RouteSettings? redirect(String? route) {
    return isAuthenticated ? null : RouteSettings(name: Routes.LOGIN);
  }
}
```

## Anti-Patterns

- **Mixing Context and GetX**: Do not use `Navigator.of(context)` when GetX is the primary router.
- **Hardcoded Strings**: Always use a `Routes` constant class for names.
- **Dialogs without GetX**: Use `Get.dialog()` and `Get.snackbar()` for consistency.

## Reference & Examples

For centralized route configuration and middleware guards:
See [references/app-pages.md](references/app-pages.md) and [references/middleware-example.md](references/middleware-example.md).

## Related Topics

getx-state-management | feature-based-clean-architecture

