| ํญ๋ชฉ | ๋ด์ฉ |
| Invoke | /app:route |
| Aliases | /route:create, /nav:setup |
| Tools | Read, Edit, Write, Glob, Grep |
| Model | sonnet |
| Skills | flutter-ui |
Route Agent#
Specialized agent for generating GoRouter TypedRoute configuration
Role#
Generates GoRouter-based TypedRoute configuration.
- TypedGoRoute annotation definition
- GoRouteData class implementation
- RouteName abstract class pattern
- Transition page configuration
- Nested route structure
Activation Conditions#
/app:route Activated when command is invoked
- Called after
/feature:create orchestration Presentation Phase
Parameters#
| Parameter | Required | Description |
feature_name | โ
| Feature module name (snake_case) |
route_type |
โ |
app, console (default: app) |
transition |
โ |
fade, slide, none (default: fade) |
nested_routes | โ | Nested Route List |
Generated Files#
feature/{app_type}/{feature_name}/lib/src/route/
โโโ route.dart # Export ํ์ผ
โโโ {feature_name}_route.dart # ๋ผ์ฐํธ ์ ์
โโโ {feature_name}_route.g.dart # ์๋ ์์ฑ (build_runner)
Import Order (Required)#
// 1. Feature package (page import)
import 'package:{feature_name}/{feature_name}.dart';
// 2. Dependency packages
import 'package:dependencies/dependencies.dart';
// 3. Core (transition pages)
import 'package:core/core.dart';
// 4. Generated files
part '{feature_name}_route.g.dart';
Core Patterns#
1. App Route Definition (FadeTransitionPage)#
part '{feature_name}_route.g.dart';
/// {Feature} ํ๋ฉด ๋ผ์ฐํธ ์ ์
///
/// ์ฑ์ {feature} ํ๋ฉด์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
/// ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ก [FadeTransitionPage]๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@TypedGoRoute<{Feature}Route>(
path: {Feature}RouteName.path,
routes: [
// in progress์ฒฉ ๋ผ์ฐํธ ์ ์
TypedGoRoute<{Feature}DetailRoute>(
path: {Feature}DetailRoute.path,
),
],
)
class {Feature}Route extends GoRouteData with ${Feature}Route {
/// {Feature} ํ๋ฉด ๋ผ์ฐํธ ์์ฑ์
const {Feature}Route({this.initialId});
/// ์ด๊ธฐ ID (์ ํ์ฌํญ)
final int? initialId;
/// {Feature} ํ๋ฉด ๋ผ์ฐํธ ๊ฒฝ๋ก
static const String path = {Feature}RouteName.path;
static const LocalKey _key = ValueKey(path);
@override
FadeTransitionPage buildPage(BuildContext context, GoRouterState state) {
return FadeTransitionPage(
key: _key,
child: {Feature}Page(initialId: initialId),
);
}
}
2. Console Route Definition (NoTransitionPage)#
/// Console {Feature} ํ๋ฉด ๋ผ์ฐํธ ์ ์
///
/// ์ด๋๋ฏผ ์ฝ์์ {feature} ํ๋ฉด์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
/// ํธ๋์ง์
์์ด [NoTransitionPage]๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@TypedGoRoute<Console{Feature}Route>(
path: Console{Feature}RouteName.path,
routes: [
TypedGoRoute<{Feature}DetailRoute>(
path: {Feature}DetailRoute.path,
),
],
)
class Console{Feature}Route extends GoRouteData with $Console{Feature}Route {
/// Console{Feature} ํ๋ฉด ๋ผ์ฐํธ ์์ฑ์
const Console{Feature}Route();
/// Console{Feature} default ๊ฒฝ๋ก
static RouteBase get base => Console{Feature}RouteName.base;
@override
Page<void> buildPage(BuildContext context, GoRouterState state) {
// ๐ ๋์ key ์์ฑ (์ฟผ๋ฆฌ ๋ณํ์ ๋ฐ๋ผ ํ์ด์ง ์ฌ์์ฑ)
final query = state.uri.query;
final pageKey = ValueKey(
'console_{feature}_list-${query.isNotEmpty ? query : 'noq'}',
);
return NoTransitionPage<void>(
key: pageKey,
child: const Console{Feature}Page(),
);
}
}
3. RouteName Abstract Class Pattern#
/// {Feature} ๋ผ์ฐํธ ๊ฒฝ๋ก ์ด๋ฆ์ ์ ์ํ๋ ์ถ์ ํด๋์ค
///
/// [path]๋ '/{feature}'๋ก ์ค์ ๋์ด {feature} ํ๋ฉด์ ๊ฒฝ๋ก๋ก ์ฌ์ฉ๋ฉ๋๋ค.
abstract class {Feature}RouteName {
/// {Feature} ํ๋ฉด ๋ผ์ฐํธ ๋ฒ ์ด์ค
static RouteBase get base => ${featureCamel}Route;
/// {Feature} ํ๋ฉด ๋ผ์ฐํธ ๊ฒฝ๋ก
static const String path = '/{feature}';
/// {Feature} ํ๋ฉด ๋ผ์ฐํธ ์ด๋ฆ
static const String name = '{feature}';
}
4. Nested Route Definition#
/// {Feature} ์์ธ ํ๋ฉด ๋ผ์ฐํธ ์ ์
///
/// ์ค์ ๊ฒฝ๋ก๋ '/{feature}/{id}'๊ฐ ๋ฉ๋๋ค.
@immutable
class {Feature}DetailRoute extends GoRouteData with ${Feature}DetailRoute {
/// {Feature} ์์ธ ํ๋ฉด ๋ผ์ฐํธ ์์ฑ์
const {Feature}DetailRoute({required this.id});
/// ์กฐํํ {feature}์ ID
final int id;
/// {Feature} ์์ธ ํ๋ฉด ๋ผ์ฐํธ ๊ฒฝ๋ก
static const String path = ':id';
@override
FadeTransitionPage buildPage(BuildContext context, GoRouterState state) {
// id์ ์ ์ฒด ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ํฌํจํ์ฌ ๊ณ ์ ํ ํค ์์ฑ
final fullPath = state.uri.toString();
final pageKey = ValueKey('{feature}Detail/$fullPath');
return FadeTransitionPage(
key: pageKey,
child: {Feature}DetailPage(id: id),
);
}
}
5. Query Parameter Parsing Helpers#
/// ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์์ ์ ์ ๊ฐ์ ํ์ฑํ๋ ํฌํผ ํจ์
int? _parseIntQueryParam(String? value) {
return value != null ? int.tryParse(value) : null;
}
/// ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์์ ๋ถ๋ฆฌ์ธ ๊ฐ์ ํ์ฑํ๋ ํฌํผ ํจ์
bool _parseBoolQueryParam(String? value) {
return value?.toLowerCase() == 'true';
}
6. Route Constants Definition#
/// ๋ผ์ฐํธ ์์ ์ ์ (private)
abstract class _RouteConstants {
/// Detail ๋ผ์ฐํธ ์๋ณ์
static const String detail = 'detail';
/// ํธ์ง ๋ผ์ฐํธ ์๋ณ์
static const String edit = 'edit';
/// ์ถ๊ฐ ๋ผ์ฐํธ ์๋ณ์
static const String add = 'add';
}
Transition Page Types#
| Type | Class | Where Used |
| Fade | FadeTransitionPage | App general screens |
| Slide | SlideTransitionPage | Modal, detail screens |
| None | NoTransitionPage | Console, tab switching |
Reference Files#
feature/application/store/lib/src/route/store_route.dart
feature/console/console_member_list/lib/src/route/console_member_list_route.dart
feature/application/app_router/lib/src/route/app_routes.dart
package/core/lib/src/transition/
Checklist#