> flutter-go-router-navigation
Typed routes, route state, and redirection using go_router. Use when implementing go_router typed routes, guards, or redirects in Flutter. (triggers: **/router.dart, **/app_router.dart, GoRouter, GoRoute, StatefulShellRoute, redirection, typed-routes)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/flutter-go-router-navigation?format=md"GoRouter Navigation
Priority: P0 (CRITICAL)
Type-safe deep linking and routing system using go_router and go_router_builder.
Structure
core/router/
├── app_router.dart # Router configuration
└── routes.dart # Typed route definitions (GoRouteData)
Implementation Guidelines
- Typed Routes: Always use GoRouteData and @TypedGoRoute from
go_router_builder. Never use raw path strings. - Parameters: Define strongly-typed parameters in the route class (e.g.,
class OrderDetailRoute extends GoRouteData { final String id; }) with paths like '/orders/:id'. - Root Router: One global
GoRouterinstance registered in DI. - Sub-Routes: Nest related routes using
TypedGoRouteand children lists. - Redirection: Handle Auth (Login check) in the redirect callback of the
GoRouterconfig:redirect: (context, state) => isLoggedIn ? null : '/login'. Do NOT check auth inside the page widget. - Tabs: Use StatefulShellRoute with branches for a bottom tab bar (Home, Orders, Profile) so each tab maintains its own navigation stack.
- Transitions: Define standard transitions (Fade, Slide) in
buildPage. - Navigation: Use MyRoute().go(context) or
MyRoute().push(context). Using OrderDetailRoute(id: id).go(context) is the only allowed way to navigate.
Code
// Route Definition
@TypedGoRoute<HomeRoute>(path: '/')
class HomeRoute extends GoRouteData {
@override
Widget build(context, state) => const HomePage();
}
// Router Config
final router = GoRouter(
routes: $appRoutes,
redirect: (context, state) {
if (notAuthenticated) return '/login';
return null;
},
);
Anti-Patterns
- ❌
context.go('/orders/123')with a raw string path — always use typedGoRouteDataclasses (e.g.,OrderDetailRoute(id: 123).go(context)) - ❌ Auth check inside the page widget's
build()— redirect logic belongs in theGoRouter.redirectcallback, not the UI - ❌ Multiple
GoRouterinstances — register one global instance in DI and share it throughout the app - ❌ Navigating to a deep link without validating the ID in
redirect— always verify IDs/parameters exist before building the route
Related Topics
layer-based-clean-architecture | auto-route-navigation | security
> related_skills --same-repo
> common-store-changelog
Generate user-facing release notes for the Apple App Store and Google Play Store by collecting git history, triaging user-impacting changes, and drafting store-compliant changelogs. Enforces character limits (App Store ≤4000, Google Play ≤500), tone, and bullet format. Use when generating release notes, app store changelog, play store release, what's new, or version release notes for any mobile app. (triggers: generate changelog, app store notes, play store release, what's new, release notes, ve
> golang-tooling
Go developer toolchain — gopls LSP diagnostics, linting, formatting, and vet. Use when setting up Go tooling, running linters, or integrating gopls with Claude Code. (triggers: gopls, golangci-lint, golangci.yml, go vet, goimports, staticcheck, go tooling, go lint)
> common-ui-design
Design distinctive, production-grade frontend UI with bold aesthetic choices. Use when building web components, pages, interfaces, dashboards, or applications in any framework (React, Next.js, Angular, Vue, HTML/CSS). (triggers: build a page, create a component, design a dashboard, landing page, UI for, build a layout, make it look good, improve the design, build UI, create interface, design screen)
> common-owasp
OWASP Top 10 audit checklist for Web Applications (2021) and APIs (2023). Load during any security review, PR review, or codebase audit touching web, mobile backend, or API code. (triggers: security review, OWASP, broken access control, IDOR, BOLA, injection, broken auth, API review, authorization, access control)