fl-reviewer
Reviews UI-layer changes — screens, blocs, widgets, routes — against the template's StateBase + CoreBlocBase + fl_theme conventions
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Reviews UI-layer changes — screens, blocs, widgets, routes — against the template's StateBase + CoreBlocBase + fl_theme conventions
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Behavioral guidelines for Flutter base tasks: clarify ambiguity, keep changes simple and surgical, and define verifiable success criteria before coding.
Scaffolds a new feature module under apps/main/lib/presentation/modules using the bundled module generator
Awareness index of every reusable widget in fl_ui, fl_theme, fl_media, and core's common_widget — name, one-line purpose, when to reach for it instead of writing a new one
Builds the data layer with Freezed DTOs, Retrofit clients, the storage-seam local data manager, and repositories wired through injectable
Teaches and applies Flutter/Dart dependency injection with Injectable + GetIt, grounded in this repo's Clean Architecture and code generation conventions. Use when changing DI wiring, adding BLoCs/use cases/repositories/modules, using @Named/@preResolve/@factoryParam/env registrations, reviewing DI best practices, or setting up DI tests.
Writes unit and widget tests for blocs, repositories, and screens using bloc_test + mocktail
| name | fl-reviewer |
| description | Reviews UI-layer changes — screens, blocs, widgets, routes — against the template's StateBase + CoreBlocBase + fl_theme conventions |
| license | MIT |
| metadata | {"audience":"flutter-developers","framework":"flutter","pattern":"code-review"} |
presentation/, including screens, blocs, routes, coordinators, and shared widgets.CoreBlocBase<E, S> (not Bloc/Cubit directly) and is @Injectable().<feature>_bloc.dart has the three part directives (freezed/event/state) in the right order._StateData is @freezed sealed class with @Default(...) on collections.extends FeatureState (abstract base), not a freezed union — and every concrete class is registered in _factories.<X>Event — no freezed unions for events either.showLoading() / hideLoading() (the CoreDelegate fan-out) inside try/finally; no ad-hoc spinners.fl-error-handling).StatefulWidget; state extends StateBase<T> (not raw State<T>).bloc getter overridden to BlocProvider.of(context).static String routeName declared, leading slash, lowercase.ScreenForm / MainPageForm rather than raw Scaffold + AppBar unless there's a reason.trans = translate(context) or context.l10n; no hardcoded user-facing strings or cached localization state.<feature>.action.dart) is a part of the screen and holds _blocListener, onRefresh, etc.Scaffold has a footer or bottom nav, keep it fixed and pad the scrollable body with MediaQuery.viewInsets.bottom; otherwise match ScreenForm's platform-aware resizeToAvoidBottomInset behavior unless there is a documented reason not to.IRoute and exposes List<CustomRouter> from routers().CustomRouter<Args> (typed) when extras are non-null.BlocProvider; bloc created via injector.get(...).extraFromUrlQueries set when the screen should be deep-linkable.buildRequiredRouteExtra<T> or equivalent shared guard instead of repeated unsafe casts.buildFlGoRouter with the relevant IRoute providers.goToX on BuildContext, all taking a PushBehavior, and uses Args(...).adaptiveArguments rather than the retired adaptive.package:go_router/go_router.dart imports in feature code.BrandColor.* references (it doesn't exist here).Colors.white/Colors.black for surfaces or text — use context.themeColor.*.titleMedium, bodySmall, …) plus the AppTextTheme extras (titleTiny, inputTitle, buttonText, …) — not invented tokens like titleMd/bodyXs.ThemeButton.* defaults; per-call style: overrides are scoped, not redundant.fl-ui-components for what already exists.context.decorationTheme where reusable theme tokens apply.const constructors used wherever inputs are constant.ListView.builder / Sliver* — not ListView(children: items.map(...).toList()).RepaintBoundary when independently animating.setState inside build.final over var where the variable is not reassigned.Reply with:
<feature>_state.dart without a matching _factories entry (runtime crash on first copyWith<T>())._blocListener doesn't call hideLoading() on every state — the loading indicator can stick.<Screen>.routeName.fl-ui-components).Text(...) with a literal English string anywhere in production code.setState inside a BlocBuilder.builder (rebuild loop).initialValue fields after imported/preset state changes.