flutter-use-column-row-first について
レスポンシブな画面を作る Flutter 開発者向けのレイアウトスキルです。Column と Row を起点に制約や適応パターンを使い、画面サイズに固定された構成を避けます。
主な機能
- 01Column と Row を起点に構成
- 02フレックスウィジェットで空間を配分
- 03折り返しとスクロールへの対応
- 04利用可能な空間に応じた構成変更
- 05制約とオーバーフローの確認
活用シーン
- 01レスポンシブな Flutter 画面の構築
- 02テキストや Row のオーバーフロー防止
- 03折り返しとスクロールの選択
- 04狭い画面と広い画面への適応
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ evanca/ flutter-ai-rules --skill flutter-use-column-row-firstインストール後、Claude Code で/flutter-use-column-row-firstを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
まず Flutter では Column と Row を使う
制約システムを起点に、レスポンシブな Flutter レイアウトを構築します。シンプルなフレックス構成を優先し、固定サイズやオーバーレイは、具体的な目的のためにデザイン上必要な場合にのみ導入します。
レイアウトの手順
- 各グループが主に垂直、水平、重なり、スクロール、折り返しのどれに当たるかを判断します。
- 垂直方向のグループには
Column、水平方向のグループにはRowから使い始めます。 buildメソッドを深くネストするのではなく、小さく名前を付けたウィジェットをネストします。- 制約された空きスペースを配分するには、
Expanded、Flexible、Spacerを使います。 - パディング、配置、アスペクト比、制約は意図を持って追加します。
- 狭い制約と広い制約、テキストの拡大、キーボードの表示、長いコンテンツやローカライズされたコンテンツでテストします。
ルール
- 垂直方向の流れには
Column、水平方向の流れにはRowを優先します。 mainAxisAlignment、crossAxisAlignment、mainAxisSizeで配置を調整します。- 子ウィジェットが主軸上の残りのスペースの割り当て分を使い切る必要がある場合は、
Expandedを使います。 - 子ウィジェットが割り当て分より少ないスペースを使ってもよい場合は、
Flexibleを使います。 flexは比例配分を表す場合にのみ使います。flex: 2の子ウィジェットは、flex: 1の兄弟ウィジェットの 2 倍の空きスペースを受け取ります。- 兄弟ウィジェットの間に柔軟な間隔を設ける場合は
Spacerを使います。意図的に固定間隔を設ける場合はSizedBoxを使います。 Row内で、可変幅のコンテンツが兄弟ウィジェットにスペースを譲る必要がある場合は、ExpandedまたはFlexibleで囲みます。- 垂直方向のコンテンツがビューポートを超える可能性がある場合は、
ListViewまたは別のスクロール可能なウィジェットを使います。Columnはスクロールしません。 - 水平方向の子ウィジェットを縮小したりオーバーフローさせたりせず、次の行に折り返す場合は
Wrapを使います。 - 使用可能なスペースに応じて構成自体を変更する必要がある場合は、
LayoutBuilder、ブレークポイント、またはアダプティブウィジェットを使います。 - コンテンツをシステム領域と重ならないようにする必要がある場合は、
SafeAreaを使います。
硬直したレイアウトを避ける
デフォルトのレイアウト手段として、次のものを避けます。
- ハードコードした
Positioned座標を使うStack - 画面サイズを想定した幅や高さをハードコードした
Container、SizedBox、またはConstrainedBox - 通常のドキュメントフローを模擬するために使うオフセット、変換、マージン
- モックアップからコピーした画面サイズ
次のような具体的な目的がある場合は使います。
- 実際に視覚的な重なりが必要な場合、バッジ、フローティングコントロール、固定する装飾
- タッチターゲットの最小サイズ、アイコンサイズ、サムネイル、サイズ制限のあるメディア
- 意図的に設定する読みやすさのための最大幅
- アスペクト比の要件
- プラットフォームまたはデザインシステムの定数
目的が明らかでない場合は、コードの構造や簡潔なコメントで目的を示します。
制約の安全性
ExpandedとFlexibleは、Row、Column、またはFlexの配下でのみ使います。- 非制限の主軸にゼロ以外の flex を使わないでください。垂直方向のスクロール可能なウィジェットでは、垂直方向の
ExpandedまたはFlexibleを削除するか、意味のある有限の制約を設定します。 - 外側の
Columnの残りの高さを使う必要があるネストされたColumnは、内側のColumnをExpandedで囲んで修正します。 - オーバーフローが発生した場合は、クリッピングや小さな固定サイズを追加する前に、制約と可変コンテンツを調べて原因を特定します。
- 正当に使用可能なスペースを超えるコンテンツには、スクロールを優先します。
推奨パターン
Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Header(),
const SizedBox(height: 16),
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Flexible(flex: 2, child: PrimaryContent()),
const SizedBox(width: 16),
const Flexible(child: SecondaryContent()),
],
),
),
const SizedBox(height: 16),
const Actions(),
],
),
)
狭い画面で水平方向のコンテンツを使いやすい状態に保てない場合は、ブレークポイントでこの構成を変更します。単に押し縮めるだけにしないでください。
ビジュアルリファレンス
モックアップをネストされたフレックスレイアウトに分解する際は、次の図を確認してください。
- Pavlova の Row と Column のレイアウト は、垂直方向のコンテンツ用
Columnと画像を含む、全体を構成する水平方向のRowを示しています。 - ネストされた Row と Column の図 は、評価とアイコンの小さなグループを、ネストされた
RowおよびColumnウィジェットに分解する方法を示しています。
図は構造上の参考として使い、固定ピクセルのテンプレートとして使わないでください。
検証
- サポート対象のビューポートサイズで RenderFlex のオーバーフローが発生しないことを確認します。
- テキストが意図どおりに折り返される、または切り詰められることを確認します。
- 柔軟な子ウィジェットが境界のある制約を受け取ることを確認します。
- スクロール可能なコンテンツに引き続きアクセスできることを確認します。
- 固定サイズや
StackまたはPositionedの使用に、明確な設計上の理由があることを確認します。
参考資料
コメント
Markdown 対応