Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Flutter UI実装のアーキテクチャ規約・コンポーネント分割・状態管理ガイド(Bloc/Cubit版)
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 68% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 70% | 0% |
SSOT (Single Source of Truth) + UDF (Unidirectional Data Flow) に基づく設計。
dart// NG: プライベートメソッドでのWidget分割 class MyScreen extends StatefulWidget { Widget _buildHeader() { ... } Widget _buildBody() { ... } Widget _buildFooter() { ... } }
dart// OK: 独立したWidgetクラスに分割 class MyScreenHeader extends StatelessWidget { ... } class MyScreenBody extends StatelessWidget { ... } class MyScreenFooter extends StatelessWidget { ... }
dartclass ChatSessionCubit extends Cubit<ChatSessionState> { ChatSessionCubit() : super(const ChatSessionState()); void sendMessage(String text) { // Command (Path B) emit(state.copyWith(/* ... */)); } }
dartclass ConnectionCubit extends BridgeCubit<BridgeConnectionState> { ConnectionCubit(super.initialState, super.stream); }
dart@freezed class ChatSessionState with _$ChatSessionState { const factory ChatSessionState({ @Default([]) List<ChatEntry> entries, @Default(SessionStatus.idle) SessionStatus status, }) = _ChatSessionState; }
@Default で初期値を明示lib/features/<feature>/
├── <feature>_screen.dart # 画面Widget
├── state/
│ ├── <feature>_state.dart # Freezed state classes
│ ├── <feature>_cubit.dart # Cubit
│ └── <feature>_state.freezed.dart # 生成ファイル
└── widgets/
├── <component_a>.dart # 独立Widget
└── <component_b>.dart| 種別 | 命名 | 例 | |------|------|-----| | 画面 | *_screen.dart | chat_screen.dart | | 状態 | *_state.dart | chat_session_state.dart | | Cubit | *_cubit.dart | chat_session_cubit.dart | | Widget | 機能を表す名前 | chat_app_bar.dart |
UI要素にはValueKeyを付与し、Marionette MCPでの自動テストを可能にする。
{要素の機能}_{要素タイプ}dartElevatedButton( key: const ValueKey('approve_button'), onPressed: _approve, child: const Text('Approve'), ) TextField( key: const ValueKey('message_input'), controller: _controller, )
| タイプ | 用途 | |--------|------| | _button | ボタン | | _field | テキスト入力 | | _input | テキスト入力(短い) | | _list | リスト | | _fab | FloatingActionButton | | _toggle | トグル | | _chip | チップ | | _badge | バッジ | | _indicator | インジケーター |
Flutter公式AIルール (flutter/flutter docs/rules) から、本プロジェクトに適用可能なものを抜粋。
const を使いリビルドを削減するcompute() で別Isolateに逃がす=>) を使うresolveWith で定義Semantics Widgetで説明ラベルを付与状態クラスの変更後は必ず実行:
bashcd apps/mobile && dart run build_runner build --delete-conflicting-outputs
実装完了時に確認:
_buildXxx() メソッドが残っていないことdart analyze apps/mobile がクリーンdart format apps/mobile が適用済みflutter test)Other measured skills in the registry, with their headline benchmark lift.