flutter-apply-architecture-best-practices
UIレイヤー・ロジックレイヤー・データレイヤーによる推奨の階層型アーキテクチャを用いて、Flutterアプリケーションを設計します。新規プロジェクトの構造化や、スケーラビリティを考慮したリファクタリングを行う際に使用してください。
description の原文を見る
Architects a Flutter application using the recommended layered approach (UI, Logic, Data). Use when structuring a new project or refactoring for scalability.
SKILL.md 本文
Flutter アプリケーションのアーキテクチャ設計
Contents
Architectural Layers
関心の厳密な分離を実施することにより、アプリケーションを異なるレイヤーに分割します。UI レンダリングをビジネスロジックやデータ取得と混在させないでください。
UI Layer (Presentation)
MVVM (Model-View-ViewModel) パターンを実装して UI 状態とロジックを管理します。
- Views: 再利用可能でシンプルなウィジェットを作成します。Views のロジックを UI 固有の操作 (例: アニメーション、レイアウト制約、簡単なルーティング) に制限します。必要なデータはすべて ViewModel から渡します。
- ViewModels: UI 状態を管理し、ユーザーインタラクションを処理します。
ChangeNotifier(またはListenable) を拡張して状態を公開します。イミュータブルな状態スナップショットを View に公開します。コンストラクタを使用して Repository を ViewModel にインジェクトします。
Data Layer
Repository パターンを実装して、データアクセスロジックを分離し、単一の情報源を作成します。
- Services: 外部 API (HTTP クライアント、ローカルデータベース、プラットフォームプラグイン) をラップするステートレスクラスを作成します。raw API モデルまたは
Resultラッパーを返します。 - Repositories: 1 つ以上の Services を使用します。raw API モデルをクリーンな Domain Model に変換します。キャッシング、オフライン同期、リトライロジックを処理します。Domain Model を ViewModels に公開します。
Logic Layer (Domain - Optional)
- Use Cases: このレイヤーはアプリケーションに ViewModel を散らかすような複雑なビジネスロジックが含まれている場合、または複数の ViewModels 全体でロジックを再利用する必要がある場合に限り実装します。このロジックを ViewModels と Repositories の間に配置される専用の Use Case (interactor) クラスに抽出します。
Project Structure
ハイブリッドアプローチを使用してコードベースを整理します: UI コンポーネントを機能ごとにグループ化し、Data/Domain コンポーネントを種類ごとにグループ化します。
lib/
├── data/
│ ├── models/ # API models
│ ├── repositories/ # Repository implementations
│ └── services/ # API clients, local storage wrappers
├── domain/
│ ├── models/ # Clean domain models
│ └── use_cases/ # Optional business logic classes
└── ui/
├── core/ # Shared widgets, themes, typography
└── features/
└── [feature_name]/
├── view_models/
└── views/
ワークフロー: 新機能の実装
アプリケーションに新機能を追加する際は、この順序付きワークフローに従います。チェックリストをコピーして進捗を追跡します。
Task Progress
- Step 1: Domain Models を定義します。
freezedまたはbuilt_valueを使用して、機能のためのイミュータブルなデータクラスを作成します。 - Step 2: Services を実装します。 外部 API 通信を処理するための Service クラスを作成または更新します。
- Step 3: Repositories を実装します。 Services を使用して Domain Models を返す Repository を作成します。
- Step 4: 条件付きロジックを適用します (Domain Layer)。
- 機能が複雑なデータ変換またはクロスリポジトリロジックを必要とする場合: Use Case クラスを作成します。
- 機能がシンプルな CRUD 操作である場合: Step 5 にスキップします。
- Step 5: ViewModel を実装します。
ChangeNotifierを拡張する ViewModel を作成します。必要な Repositories/Use Cases をインジェクトします。イミュータブルな状態とコマンドメソッドを公開します。 - Step 6: View を実装します。 UI ウィジェットを作成します。
ListenableBuilderまたはAnimatedBuilderを使用して ViewModel の変更をリッスンします。 - Step 7: 依存関係をインジェクトします。 新しい Service、Repository、ViewModel を依存性注入コンテナ (例:
providerまたはget_it) に登録します。 - Step 8: Validator を実行します。 ViewModel と Repository のユニットテストを実行します。
- フィードバックループ: テストを実行 -> 失敗をレビュー -> ロジックを修正 -> 合格するまで再実行します。
Examples
Data Layer: Service と Repository
// 1. Service (Raw API interaction)
class ApiClient {
Future<UserApiModel> fetchUser(String id) async {
// HTTP GET implementation...
}
}
// 2. Repository (Single source of truth, returns Domain Model)
class UserRepository {
UserRepository({required ApiClient apiClient}) : _apiClient = apiClient;
final ApiClient _apiClient;
User? _cachedUser;
Future<User> getUser(String id) async {
if (_cachedUser != null) return _cachedUser!;
final apiModel = await _apiClient.fetchUser(id);
_cachedUser = User(id: apiModel.id, name: apiModel.fullName); // Transform to Domain Model
return _cachedUser!;
}
}
UI Layer: ViewModel と View
// 3. ViewModel (State management and presentation logic)
class ProfileViewModel extends ChangeNotifier {
ProfileViewModel({required UserRepository userRepository})
: _userRepository = userRepository;
final UserRepository _userRepository;
User? _user;
User? get user => _user;
bool _isLoading = false;
bool get isLoading => _isLoading;
Future<void> loadProfile(String id) async {
_isLoading = true;
notifyListeners();
try {
_user = await _userRepository.getUser(id);
} finally {
_isLoading = false;
notifyListeners();
}
}
}
// 4. View (Dumb UI component)
class ProfileView extends StatelessWidget {
const ProfileView({super.key, required this.viewModel});
final ProfileViewModel viewModel;
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: viewModel,
builder: (context, _) {
if (viewModel.isLoading) {
return const Center(child: CircularProgressIndicator());
}
final user = viewModel.user;
if (user == null) {
return const Center(child: Text('User not found'));
}
return Column(
children: [
Text(user.name),
ElevatedButton(
onPressed: () => viewModel.loadProfile(user.id),
child: const Text('Refresh'),
),
],
);
},
);
}
}
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- flutter
- リポジトリ
- flutter/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/flutter/skills / ライセンス: BSD-3-Clause
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。