flutter-skill
npx skills add https://github.com/thruthesky/flutter-skill --skill flutter-skill
Agent 安装分布
Skill 文档
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) ê¸°ë° ìë ë§ë£ë¥¼ ì§ìí©ëë¤.
- pub.dev: file_cache_flutter
주ì 기ë¥
| ê¸°ë¥ | ì¤ëª |
|---|---|
| ì´ì¤ ìºì± | ë©ëª¨ë¦¬ì íì¼ ìºì ëì íì©ì¼ë¡ ë¹ ë¥¸ ì ê·¼ |
| 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 ì°ì