Flutter Skill
본 스킬은 Flutter 프레임워크로 앱을 개발하는 데 반드시 따라야 하는 범용적인 UI/UX 디자인, 상태관리, 네트워킹, API 연동에 관한 가이드라인을 제공합니다. 즉, 본 스킬은 특정 앱에 종속되는 코딩 가이드라인을 제공하는 것이 아니라, 다양한 종류의 플러터 앱 개발에 사용 될 수 있는 범용적인 지침을 제공합니다.
Table of Contents
Workflow
개발자 요청에 따라 아래 워크플로우를 따릅니다:
디자인/UI/UX 요청 시: Comic Design 문서 참조
- 키워드: 디자인, UI, UX, 버튼, 카드, 레이아웃, 애니메이션, Comic, 코믹
레이아웃 요청 시: Flutter Layout 문서 참조
- 키워드: 레이아웃, 스크롤, CustomScrollView, ListView, 위젯 배치
상태관리 요청 시: Provider 문서 참조
- 키워드: 상태관리, Provider, Selector, ChangeNotifier
라우팅 요청 시: Go Route 문서 참조
- 키워드: 라우팅, 네비게이션, GoRouter, 페이지 이동
다국어 요청 시: i18n 문서 참조
- 키워드: 다국어, 번역, localization, i18n, arb
푸시 알림/FCM 요청 시: Firebase FCM 문서 참조
- 키워드: 푸시 알림, FCM, Firebase Messaging, 알림, notification, 토큰, 구독
Firebase 인증 요청 시: Firebase Auth 문서 참조
- 키워드: Firebase Auth, 로그인, 회원가입, 인증, 에러 처리, invalid-credential, user-not-found, wrong-password, Email enumeration protection
Core Principles
필수 규칙
// ❌ 절대 금지
color: Colors.blue // 하드코딩된 색상
fontSize: 16 // 하드코딩된 크기
Text('Hello') // 하드코딩된 텍스트
elevation: 4 // 0이 아닌 elevation
// ✅ 반드시 사용
color: Theme.of(context).colorScheme.primary // 테마 색상
style: Theme.of(context).textTheme.bodyLarge // 테마 텍스트 스타일
Text(T.hello) // i18n 번역
elevation: 0 // 플랫 디자인
테마 기반 스타일링
모든 색상, 폰트, 스타일은 반드시 Theme.of(context)를 사용합니다:
| 용도 |
사용 방법 |
| Primary 색상 |
Theme.of(context).colorScheme.primary |
| Surface 색상 |
Theme.of(context).colorScheme.surface |
| 테두리 색상 |
Theme.of(context).colorScheme.outline |
| 본문 텍스트 |
Theme.of(context).textTheme.bodyLarge |
| 제목 텍스트 |
Theme.of(context).textTheme.titleMedium |
Comic 디자인 규칙 요약
| 속성 |
값 |
설명 |
| Border Width |
2.0 (표준), 1.0 (목록) |
Comic 스타일 테두리 |
| Border Radius |
12 |
둥근 모서리 |
| Elevation |
0 |
그림자 없음 |
| 간격 |
8의 배수 |
8, 16, 24, 32... |
Reference Documents
각 문서는 해당 주제에 대한 상세한 가이드라인과 코드 예제를 제공합니다:
| 문서 |
내용 |
| comic-design.md |
Comic UI 디자인 시스템, 버튼, 카드, 폼, SnackBar 등 |
| flutter-layout.md |
스크롤 화면, CustomScrollView, ListView 패턴 |
| provider.md |
Provider 상태관리, Selector, ChangeNotifier |
| go_route.md |
GoRouter 라우팅, 파라미터 전달, redirect |
| i18n.md |
다국어 지원, ARB 파일 관리 |
| firebase-fcm.md |
FCM 푸시 알림, 토큰 관리, 메시지 핸들링 |
| firebase/firebase-auth.md |
Firebase 인증, Email enumeration protection, 에러 코드 처리 (invalid-credential, user-not-found, wrong-password 등) |
필수 pub.dev 패키지
file_cache_flutter
Flutter 애플리케이션용 파일 캐시 라이브러리로, 메모리 + 파일 이중 캐싱과 TTL(Time-To-Live) 기반 자동 만료를 지원합니다.
주요 기능
| 기능 |
설명 |
| 이중 캐싱 |
메모리와 파일 캐시 동시 활용으로 빠른 접근 |
| TTL 지원 |
캐시 만료 시간 설정 가능 (기본값 30분) |
| 제네릭 타입 |
모든 데이터 타입 캐싱 가능 |
| 자동 정리 |
만료된 캐시 자동 삭제 |
설치
dependencies:
file_cache_flutter: ^0.0.3
사용 예제
import 'package:file_cache_flutter/file_cache_flutter.dart';
// 캐시 인스턴스 생성
final cache = FileCache<UserData>(
cacheName: 'user_data', // 캐시 이름 (파일 저장 경로에 사용)
fromJson: UserData.fromJson, // JSON → 객체 변환 함수
toJson: (data) => data.toJson(), // 객체 → JSON 변환 함수
defaultTtl: Duration(minutes: 30), // 기본 TTL 설정
);
// 데이터 저장
await cache.set('user_123', UserData(name: '홍길동', age: 25));
// 데이터 조회 (만료되지 않은 경우에만 반환)
final user = await cache.get('user_123');
// 캐시 존재 여부 확인
final exists = await cache.has('user_123');
// 특정 키 삭제
await cache.remove('user_123');
// 전체 캐시 삭제
await cache.clear();
// 만료된 캐시만 정리
await cache.cleanup();
주요 메서드
| 메서드 |
설명 |
get(key) |
캐시에서 데이터 조회 (만료 시 null 반환) |
set(key, data, [ttl]) |
캐시에 데이터 저장 (선택적 TTL 지정) |
has(key) |
캐시 존재 여부 확인 |
remove(key) |
특정 키의 캐시 삭제 |
clear() |
전체 캐시 삭제 |
cleanup() |
만료된 캐시 정리 |
Quick Reference
Import 문
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:provider/provider.dart';
import 'package:go_router/go_router.dart';
애니메이션 (flutter_animate 패키지 사용)
Container()
.animate()
.fadeIn(duration: 300.ms)
.slideX(begin: -0.2, end: 0)
아이콘 우선순위
Font Awesome Pro 아이콘 사용 시 우선순위: Light > Regular > Solid
FaIcon(FontAwesomeIcons.lightCamera) // Light 우선
1---2name: flutter-skill3description: 본 스킬은 Flutter 프레임워크로 앱을 개발하는 데 반드시 따라야 하는 UI/UX 디자인, 상태관리, 네트워킹, API 연동에 관한 가이드라인 제공합니다. 본 스킬은 선택적인 정보를 제공하는 것이 아니라 Flutter 앱 개발에 필수적인 지침을 제공하며 반드시 준수해야 할 사항들을 제공합니다. 개발자가 디자인, UI, UX, 디자인 효과, 상태관리, 라우팅, 네트워킹, API 연동에 관한 요청, 코믹디자인, Comic 관련 요청, 채팅, FCM, 푸시 알림, 메시지, 알림에 관한 요청이 있을 때 반드시 본 스킬을 사용해서 본 스킬이 제공하는 대로 작업을 수행해야 합니다. 각 스킬 문서에의 상단에는 반드시 따라야 할 Workflow 가 있습니다. 반드시 그 Workflow 를 따라야 합니다. (project)4---5
6# Flutter Skill
7
8본 스킬은 Flutter 프레임워크로 앱을 개발하는 데 반드시 따라야 하는 **범용적인** UI/UX 디자인, 상태관리, 네트워킹, API 연동에 관한 가이드라인을 제공합니다. 즉, 본 스킬은 특정 앱에 종속되는 코딩 가이드라인을 제공하는 것이 아니라, 다양한 종류의 플러터 앱 개발에 사용 될 수 있는 범용적인 지침을 제공합니다.
9
10## Table of Contents
11
12- [Workflow](#workflow)
13- [Core Principles](#core-principles)
14- [Reference Documents](#reference-documents)
15
16## Workflow
17
18개발자 요청에 따라 아래 워크플로우를 따릅니다:
19
201. **디자인/UI/UX 요청 시**: [Comic Design 문서](./comic-design.md) 참조
21 - 키워드: 디자인, UI, UX, 버튼, 카드, 레이아웃, 애니메이션, Comic, 코믹
22
232. **레이아웃 요청 시**: [Flutter Layout 문서](./flutter-layout.md) 참조
24 - 키워드: 레이아웃, 스크롤, CustomScrollView, ListView, 위젯 배치
25
263. **상태관리 요청 시**: [Provider 문서](./provider.md) 참조
27 - 키워드: 상태관리, Provider, Selector, ChangeNotifier
28
294. **라우팅 요청 시**: [Go Route 문서](./go_route.md) 참조
30 - 키워드: 라우팅, 네비게이션, GoRouter, 페이지 이동
31
325. **다국어 요청 시**: [i18n 문서](./i18n.md) 참조
33 - 키워드: 다국어, 번역, localization, i18n, arb
34
356. **푸시 알림/FCM 요청 시**: [Firebase FCM 문서](./firebase-fcm.md) 참조
36 - 키워드: 푸시 알림, FCM, Firebase Messaging, 알림, notification, 토큰, 구독
37
387. **Firebase 인증 요청 시**: [Firebase Auth 문서](./firebase/firebase-auth.md) 참조
39 - 키워드: Firebase Auth, 로그인, 회원가입, 인증, 에러 처리, invalid-credential, user-not-found, wrong-password, Email enumeration protection
40
41## Core Principles
42
43### 필수 규칙
44
45```dart
46// ❌ 절대 금지
47color: Colors.blue // 하드코딩된 색상
48fontSize: 16 // 하드코딩된 크기
49Text('Hello') // 하드코딩된 텍스트
50elevation: 4 // 0이 아닌 elevation
51
52// ✅ 반드시 사용
53color: Theme.of(context).colorScheme.primary // 테마 색상
54style: Theme.of(context).textTheme.bodyLarge // 테마 텍스트 스타일
55Text(T.hello) // i18n 번역
56elevation: 0 // 플랫 디자인
57```
58
59### 테마 기반 스타일링
60
61모든 색상, 폰트, 스타일은 반드시 `Theme.of(context)`를 사용합니다:
62
63| 용도 | 사용 방법 |
64|------|----------|
65| Primary 색상 | `Theme.of(context).colorScheme.primary` |
66| Surface 색상 | `Theme.of(context).colorScheme.surface` |
67| 테두리 색상 | `Theme.of(context).colorScheme.outline` |
68| 본문 텍스트 | `Theme.of(context).textTheme.bodyLarge` |
69| 제목 텍스트 | `Theme.of(context).textTheme.titleMedium` |
70
71### Comic 디자인 규칙 요약
72
73| 속성 | 값 | 설명 |
74|------|-----|------|
75| Border Width | `2.0` (표준), `1.0` (목록) | Comic 스타일 테두리 |
76| Border Radius | `12` | 둥근 모서리 |
77| Elevation | `0` | 그림자 없음 |
78| 간격 | 8의 배수 | 8, 16, 24, 32... |
79
80## Reference Documents
81
82각 문서는 해당 주제에 대한 상세한 가이드라인과 코드 예제를 제공합니다:
83
84| 문서 | 내용 |
85|------|------|
86| [comic-design.md](./comic-design.md) | Comic UI 디자인 시스템, 버튼, 카드, 폼, SnackBar 등 |
87| [flutter-layout.md](./flutter-layout.md) | 스크롤 화면, CustomScrollView, ListView 패턴 |
88| [provider.md](./provider.md) | Provider 상태관리, Selector, ChangeNotifier |
89| [go_route.md](./go_route.md) | GoRouter 라우팅, 파라미터 전달, redirect |
90| [i18n.md](./i18n.md) | 다국어 지원, ARB 파일 관리 |
91| [firebase-fcm.md](./firebase-fcm.md) | FCM 푸시 알림, 토큰 관리, 메시지 핸들링 |
92| [firebase/firebase-auth.md](./firebase/firebase-auth.md) | Firebase 인증, Email enumeration protection, 에러 코드 처리 (`invalid-credential`, `user-not-found`, `wrong-password` 등) |
93
94## 필수 pub.dev 패키지
95
96### file_cache_flutter
97
98Flutter 애플리케이션용 파일 캐시 라이브러리로, 메모리 + 파일 이중 캐싱과 TTL(Time-To-Live) 기반 자동 만료를 지원합니다.
99
100- **pub.dev**: [file_cache_flutter](https://pub.dev/packages/file_cache_flutter)
101
102#### 주요 기능
103
104| 기능 | 설명 |
105|------|------|
106| 이중 캐싱 | 메모리와 파일 캐시 동시 활용으로 빠른 접근 |
107| TTL 지원 | 캐시 만료 시간 설정 가능 (기본값 30분) |
108| 제네릭 타입 | 모든 데이터 타입 캐싱 가능 |
109| 자동 정리 | 만료된 캐시 자동 삭제 |
110
111#### 설치
112
113```yaml
114dependencies:
115 file_cache_flutter: ^0.0.3
116```
117
118#### 사용 예제
119
120```dart
121import 'package:file_cache_flutter/file_cache_flutter.dart';
122
123// 캐시 인스턴스 생성
124final cache = FileCache<UserData>(
125 cacheName: 'user_data', // 캐시 이름 (파일 저장 경로에 사용)
126 fromJson: UserData.fromJson, // JSON → 객체 변환 함수
127 toJson: (data) => data.toJson(), // 객체 → JSON 변환 함수
128 defaultTtl: Duration(minutes: 30), // 기본 TTL 설정
129);
130
131// 데이터 저장
132await cache.set('user_123', UserData(name: '홍길동', age: 25));
133
134// 데이터 조회 (만료되지 않은 경우에만 반환)
135final user = await cache.get('user_123');
136
137// 캐시 존재 여부 확인
138final exists = await cache.has('user_123');
139
140// 특정 키 삭제
141await cache.remove('user_123');
142
143// 전체 캐시 삭제
144await cache.clear();
145
146// 만료된 캐시만 정리
147await cache.cleanup();
148```
149
150#### 주요 메서드
151
152| 메서드 | 설명 |
153|--------|------|
154| `get(key)` | 캐시에서 데이터 조회 (만료 시 null 반환) |
155| `set(key, data, [ttl])` | 캐시에 데이터 저장 (선택적 TTL 지정) |
156| `has(key)` | 캐시 존재 여부 확인 |
157| `remove(key)` | 특정 키의 캐시 삭제 |
158| `clear()` | 전체 캐시 삭제 |
159| `cleanup()` | 만료된 캐시 정리 |
160
161## Quick Reference
162
163### Import 문
164
165```dart
166import 'package:flutter/material.dart';
167import 'package:font_awesome_flutter/font_awesome_flutter.dart';
168import 'package:flutter_animate/flutter_animate.dart';
169import 'package:provider/provider.dart';
170import 'package:go_router/go_router.dart';
171```
172
173### 애니메이션 (flutter_animate 패키지 사용)
174
175```dart
176Container()
177 .animate()
178 .fadeIn(duration: 300.ms)
179 .slideX(begin: -0.2, end: 0)
180```
181
182### 아이콘 우선순위
183
184Font Awesome Pro 아이콘 사용 시 우선순위: **Light > Regular > Solid**
185
186```dart
187FaIcon(FontAwesomeIcons.lightCamera) // Light 우선
188```