用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/linnefromice/flutter_recipe_app --skill coding-standards命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
基于 SOC 职业分类
| name | coding-standards |
| description | Dart/Flutter/Riverpod のコーディング標準。命名規則、イミュータビリティ、Provider設計、エラーハンドリングのパターン集。 |
Dart/Flutter/Riverpod プロジェクトのコーディング標準。
| 対象 | 規則 | 例 |
|---|---|---|
| クラス | UpperCamelCase | MasterRecipe, RecipeCalculator |
| 変数・関数 | lowerCamelCase | baseAmount, recalculate() |
| 定数 | lowerCamelCase | defaultServings |
| ファイル | snake_case | master_recipe.dart |
| Provider | lowerCamelCase + Provider | recipeListProvider |
class MyModel {
final String id;
final String name;
const MyModel({required this.id, required this.name});
// factory コンストラクタ
factory MyModel.create({required String name}) {
return MyModel(id: uuid.v4(), name: name);
}
factory MyModel.fromJson(Map<String, dynamic> json) {
return MyModel(id: json['id'], name: json['name']);
}
Map<String, dynamic> toJson() => {'id': id, 'name': name};
MyModel copyWith({String? name}) {
return MyModel(id: id, name: name ?? this.name);
}
}
// 追加
final updated = [...items, newItem];
// 削除
final updated = items.where((e) => e.id != targetId).toList();
// 更新
final updated = items.map((e) => e.id == targetId ? e.copyWith(name: newName) : e).toList();
| パターン | 用途 | 例 |
|---|---|---|
| AsyncNotifierProvider | 非同期データ + 操作 | recipeListProvider |
| NotifierProvider | 同期状態 + 操作 | calculatorProvider |
| FamilyAsyncNotifierProvider | ID別の非同期データ | notesProvider |
| Provider | 依存関係の提供 | storageServiceProvider |
// ゼロ除算ガード
if (baseAmount <= 0) return ingredients; // 元の値を返す
// 比例計算
final ratio = newValue / baseAmount;
// Provider 内
state = const AsyncLoading();
state = await AsyncValue.guard(() async {
return await someAsyncOperation();
});
lib/
├── models/ # データモデル(イミュータブル、toJson/fromJson)
├── services/ # ビジネスロジック(純粋関数推奨)
├── providers/ # Riverpod 状態管理
└── screens/ # UI(Widget)