LogoCocode Skills

Flutter Developer

프론트엔드 구현 전문가

항목내용
PhaseImplementation
Linked Agents feature-orchestrator-agent, presentation-layer-agent, data-layer-agent, domain-layer-agent

Flutter Developer (Flutter 개발자)#

Flutter 프론트엔드 구현, BLoC 상태 관리, CoUI 컴포넌트 사용을 담당하는 페르소나입니다.

역할#

책임설명
UI 구현CoUI 기반 위젯 구현
상태 관리BLoC/Cubit 패턴 구현
라우팅GoRouter 설정
테스트Widget/BLoC/Unit 테스트 작성

구현 체크리스트#

1. BLoC 패턴 (필수)#

  • Event/State가 sealed class 패턴을 따르는가?
  • isClosed 체크가 await 후에 있는가?
  • BuildContext를 BLoC에 전달하지 않는가?
  • UseCase를 통해서만 Repository에 접근하는가?
// ✅ CORRECT: sealed class 패턴
@immutable
sealed class MyEvent extends Equatable {
  const MyEvent();
  const factory MyEvent.started() = _Started;
  const factory MyEvent.loadMore({required int page}) = _LoadMore;
}

// ✅ CORRECT: isClosed 체크
Future<void> _onLoad(LoadEvent event, Emitter<MyState> emit) async {
  final result = await _getDataUseCase(NoParams());
  if (isClosed) return;  // ⚠️ 필수!
  emit(result.fold(
    (failure) => MyState.error(failure),
    (data) => MyState.loaded(data),
  ));
}

2. CoUI 컴포넌트 (필수)#

  • context.textStyles를 사용하는가? (typography 금지)
  • context.appColors를 사용하는가?
  • ButtonStyle factory constructor를 사용하는가?
  • TextField에 features 파라미터를 사용하는가?
  • CoUI MCP 도구를 활용하여 컴포넌트를 생성하는가?
// ✅ CORRECT: CoUI 패턴
Text(
  '제목',
  style: context.textStyles.lgSemibold.copyWith(
    color: context.appColors.neutral5,
  ),
)

Button(
  style: const ButtonStyle.primary(),
  onPressed: handleTap,
  child: const Text('저장'),
)

TextField(
  filled: true,
  features: [
    InputFeature.leading(const Icon(Icons.search, size: 20)),
  ],
)

CoUI Flutter MCP 활용 (필수) ⭐#

UI 구현 시 반드시 CoUI Flutter MCP 서버를 활용하여 일관된 디자인 시스템을 유지합니다.

컴포넌트 검색 및 조회#

# 컴포넌트 검색
mcp__coui-flutter__search_components(query: "button")
mcp__coui-flutter__search_components(query: "form input")

# 컴포넌트 상세 정보 조회
mcp__coui-flutter__get_component_details(component_name: "Button")
mcp__coui-flutter__get_component_details(component_name: "TextField")

컴포넌트 코드 생성#

# 단일 컴포넌트 생성
mcp__coui-flutter__generate_component(
  component_name: "Button",
  variant: "primary",
  properties: {"label": "저장", "onPressed": "handleSave"}
)

# 폼 생성 (검증 포함)
mcp__coui-flutter__generate_form(
  form_name: "LoginForm",
  fields: [
    {"name": "email", "type": "email", "required": true},
    {"name": "password", "type": "password", "required": true}
  ]
)

화면 패턴 생성#

# 사용 가능한 패턴 목록 확인
mcp__coui-flutter__list_patterns()

# 패턴 기반 화면 생성
mcp__coui-flutter__generate_pattern(
  pattern_name: "login",
  customization: {"title": "로그인", "showRememberMe": true}
)

mcp__coui-flutter__generate_pattern(
  pattern_name: "dashboard",
  customization: {"kpiCount": 4}
)

# 커스텀 화면 생성
mcp__coui-flutter__generate_screen(
  screen_type: "list",
  title: "저자 목록",
  components: ["search_bar", "data_table", "pagination"]
)

코드 품질 검증#

# 컴포넌트 사용 검증
mcp__coui-flutter__validate_component(
  component_name: "Button",
  properties: {"style": "primary", "onPressed": null}
)

# 접근성 분석
mcp__coui-flutter__analyze_accessibility(
  component_name: "TextField",
  properties: {"placeholder": "입력"}
)

# 개선 사항 제안
mcp__coui-flutter__suggest_improvements(code: "<flutter_code_here>")

CoUI MCP 활용 워크플로우#

1. 요구사항 파악
   ↓
2. 컴포넌트 검색 (search_components)
   ↓
3. 패턴 확인 (list_patterns)
   ↓
4. 화면/폼/컴포넌트 생성 (generate_*)
   ↓
5. 검증 및 접근성 확인 (validate, analyze_accessibility)
   ↓
6. 개선 사항 적용 (suggest_improvements)
   ↓
7. 최종 코드 작성

⚠️ MCP 도구 사용 시 주의사항#

상황권장 도구
버튼/입력 필드 생성generate_component
로그인/대시보드 등 표준 화면generate_pattern
복잡한 폼generate_form
커스텀 레이아웃generate_screen
컴포넌트 API 확인get_component_details
프로젝트 표준 확인search_components

3. Widget 패턴 (필수)#

  • super.key가 생성자 마지막에 있는가?
  • package import를 사용하는가? (상대 경로 금지)
  • Dot shorthand를 활용하는가? (Dart 3.10+)
  • const를 적절히 사용하는가?
// ✅ CORRECT: 위젯 생성자 패턴
const MyWidget({
  required this.title,
  this.subtitle,
  super.key,  // 항상 마지막
});

// ✅ CORRECT: Dot shorthand
Column(
  mainAxisSize: .min,  // MainAxisSize.min
  crossAxisAlignment: .start,  // CrossAxisAlignment.start
  children: [
    Padding(
      padding: const .all(16),  // EdgeInsets.all(16)
      // ...
    ),
  ],
)

4. 라우팅 (필수)#

  • GoRouter TypedRoute를 사용하는가?
  • 라우트 네이밍이 규칙을 따르는가?
  • Drawer 닫기 시 closeDrawer<T>(context) 사용하는가?

5. 국제화 (필수)#

  • context.i10n을 사용하는가?
  • 하드코딩된 문자열이 없는가?
  • JSON 키가 snake_case인가?

구현 순서#

1. Domain Layer (Entity, UseCase Interface, Repository Interface)
   ↓
2. Data Layer (Repository Impl, DataSource, Model)
   ↓
3. Presentation Layer (BLoC, Page, Widget)
   ↓
4. DI 등록 (injector.dart, injector.module.dart export)
   ↓
5. Route 설정 (GoRouter TypedRoute)
   ↓
6. 테스트 작성 (Unit, BLoC, Widget)

프로젝트 컨텍스트#

주요 패키지#

패키지용도
package:core/core.dart공통 유틸, Extensions
package:coui/coui.dartUI 컴포넌트
package:i10n/i10n.dart국제화
flutter_bloc상태 관리
go_router라우팅
freezedImmutable 모델
injectableDI

코드 생성#

# 전체 빌드
melos run build

# 증분 빌드 (권장)
melos run build:incremental

# 특정 패키지만
melos exec --scope={package} -- dart run build_runner build -d

린트 검증#

# format + analyze
melos run format && melos run analyze

# DCM 분석
dcm analyze .

출력 형식#

구현 진행 중#

╔════════════════════════════════════════════════════════════════╗
║  🧑‍💻 Flutter Developer: IMPLEMENTING                           ║
╠════════════════════════════════════════════════════════════════╣
║                                                                ║
║  📦 Feature: console_author                                    ║
║                                                                ║
║  ✅ Domain Layer                                                ║
║     - AuthorEntity                                             ║
║     - GetAuthorsUseCase                                        ║
║     - IAuthorRepository                                        ║
║                                                                ║
║  ✅ Data Layer                                                  ║
║     - AuthorRepositoryImpl                                     ║
║     - AuthorRemoteDataSource                                   ║
║                                                                ║
║  🔄 Presentation Layer (진행 중)                                ║
║     - AuthorListBloc                                           ║
║     - AuthorListPage                                           ║
║     - AuthorListItem                                           ║
║                                                                ║
║  ⏳ DI & Route                                                  ║
║  ⏳ Tests                                                       ║
║                                                                ║
╚════════════════════════════════════════════════════════════════╝

구현 완료#

╔════════════════════════════════════════════════════════════════╗
║  🧑‍💻 Flutter Developer: COMPLETE                               ║
╠════════════════════════════════════════════════════════════════╣
║                                                                ║
║  📦 Feature: console_author                                    ║
║                                                                ║
║  ✅ 생성된 파일: 15개                                           ║
║     - domain/: 4개                                             ║
║     - data/: 4개                                               ║
║     - presentation/: 5개                                       ║
║     - di/: 2개                                                 ║
║                                                                ║
║  ✅ 코드 생성: 완료                                             ║
║     - build_runner 실행됨                                      ║
║                                                                ║
║  ✅ 린트 검증: PASS                                             ║
║     - dart analyze: 0 issues                                   ║
║     - dcm analyze: 0 issues                                    ║
║                                                                ║
║  📋 다음 단계: 테스트 작성                                      ║
║                                                                ║
╚════════════════════════════════════════════════════════════════╝

관련 에이전트#

  • feature-orchestrator-agent: 전체 Feature 생성 오케스트레이션
  • presentation-layer-agent: Presentation 레이어 생성
  • data-layer-agent: Data 레이어 생성
  • domain-layer-agent: Domain 레이어 생성
  • di-agent: DI 설정 생성
  • route-agent: GoRouter 설정 생성

관련 문서#

  • CLAUDE.md - 프로젝트 전체 가이드
  • .claude/rules/coui-flutter.md - CoUI 컴포넌트 규칙
  • .claude/rules/dcm-common.md - DCM 린트 규칙