Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill flutter명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
SOC 직업 분류 기준
| name | flutter |
| description | | Use when this capability is needed. |
class ProductCard extends StatelessWidget {
final Product product;
final VoidCallback onTap;
const ProductCard({super.key, required this.product, required this.onTap});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onTap,
child: Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(product.name, style: Theme.of(context).textTheme.titleMedium),
const SizedBox(height: 4),
Text('\$${product.price}', style: const TextStyle(color: Colors.grey)),
],
),
),
),
);
}
}
// Provider definition
final productsProvider = FutureProvider<List<Product>>((ref) async {
final repo = ref.watch(productRepoProvider);
return repo.fetchAll();
});
// Usage in widget
class ProductListScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final products = ref.watch(productsProvider);
return products.when(
data: (items) => ListView.builder(
itemCount: items.length,
itemBuilder: (context, i) => ProductCard(product: items[i], onTap: () {}),
),
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, _) => Center(child: Text('Error: $err')),
);
}
}
final router = GoRouter(
routes: [
GoRoute(path: '/', builder: (_, __) => const HomeScreen()),
GoRoute(
path: '/product/:id',
builder: (_, state) => ProductScreen(id: state.pathParameters['id']!),
),
],
);
// Navigate
context.go('/product/123');
context.push('/product/123'); // pushes onto stack
final dio = Dio(BaseOptions(baseUrl: 'https://api.example.com'));
dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
options.headers['Authorization'] = 'Bearer $token';
handler.next(options);
},
));
Future<List<Product>> fetchProducts() async {
final response = await dio.get('/products');
return (response.data as List).map((e) => Product.fromJson(e)).toList();
}
// Dart side
const channel = MethodChannel('com.example/battery');
Future<int> getBatteryLevel() async {
final level = await channel.invokeMethod<int>('getBatteryLevel');
return level ?? -1;
}
| Anti-Pattern | Fix |
|---|---|
| setState in large widgets | Extract state to Riverpod/BLoC |
| Deeply nested widget trees | Extract widgets into separate classes |
| No const constructors | Add const to stateless constructors |
| String-based navigation | Use GoRouter with type-safe routes |
| No error handling on futures | Use .when() or try-catch |
Source: claude-dev-suite/claude-dev-suite — distributed by TomeVault.