はじめに
Jetpack Composeアプリの設計をAIと一緒にやるとき、どうやってUIフローを伝えますか?
- スクリーンショットをAIに貼る
- FigJamやMiroで図を描く
- 口頭で説明する
どれも情報が欠けるか、AIが扱いにくい形式です。
Mermaid(テキストフロー記法) を使うと、UIフローをコードとして管理しながら、AIに直接渡せる形式で持てます。
ツール比較:何がAIに一番伝わるか
| ツール | AIとの相性 | Git管理 | 実装との連携 |
|---|---|---|---|
| スクリーンショット | 低 | ✕ | ✕ |
| FigJam / Miro | 中 | ✕ | 弱い |
| Mermaid | 高 | ○ | ○ |
Mermaidが強い理由:
- テキストなのでそのままプロンプトに貼れる
- Gitで差分管理できる
- Compose Navigationの構造と対応しやすい
- AIが生成・修正しやすい
Mermaidの基本書き方
Mermaid UIフローの本質は「画面(Screen)=ノード、遷移=矢印」です。
最小構成
flowchart TD
Home --> Detail
Detail --> Edit
条件付き遷移
flowchart TD
Home --> Detail
Detail -->|habitId必須| Edit
Edit -->|ログイン済みのみ| Confirm
Confirm --> Home
状態を入れる(重要)
UIフローは「状態」でUXが変わります。状態を明示すると設計の破綻が見えやすくなります。
flowchart TD
Home["Home\n[state: listLoaded]"]
Detail["Detail\n[state: habitSelected]"]
Edit["Edit\n[state: formDirty]"]
Home --> Detail
Detail --> Edit
Edit -->|保存| Home
Edit -->|キャンセル| Detail
Compose Navigationとの対応
Mermaidの書き方をJetpack Compose Navigationに対応させると設計が明確になります。
flowchart TD
NavGraph["NavGraph"]
NavGraph --> Home
NavGraph --> Detail
NavGraph --> Edit
Home -->|"navigate(Detail)"| Detail
Detail -->|"navigate(Edit)"| Edit
Edit -->|"popBackStack()"| Detail
// Mermaidの構造をそのままNavigationに反映
NavHost(navController, startDestination = "home") {
composable("home") { HomeScreen(navController) }
composable("detail/{habitId}") { DetailScreen(navController) }
composable("edit/{habitId}") { EditScreen(navController) }
}
タブ・BottomNavの表現
Mermaidはタブの表現が得意ではありません。タブは「画面遷移」ではなく「UI状態」だからです。
しかし表現方法はあります。
方法1: 分岐ノードで表現(最もシンプル)
flowchart TD
App --> Home
App --> Search
App --> Profile
Home --> Detail
方法2: subgraphで囲う(視覚的にわかりやすい)
flowchart TD
subgraph BottomNav
Home
Search
Profile
end
Home --> Detail
Detail --> Edit
方法3: 状態として表現(Compose的に正確)
flowchart TD
MainScreen["MainScreen\n[selectedTab: Home|Search|Profile]"]
MainScreen -->|tab=Home| HomeContent
MainScreen -->|tab=Search| SearchContent
MainScreen -->|tab=Profile| ProfileContent
HomeContent --> Detail
「タブは状態」という考え方
Mermaidで無理やり全部を表現しようとすると破綻します。
正しいレイヤー分離:
| レイヤー | 表現方法 |
|---|---|
| 画面遷移(Navigate) | Mermaid |
| タブ・BottomNav状態 | state / subgraph |
| UI内部状態(フォームなど) | ViewModel |
flowchart TD
subgraph "Main (BottomNav)"
Home
Search
Profile
end
Home -->|"navigate(Detail)"| Detail
Detail -->|"navigate(Edit)"| Edit
Edit -->|"popBackStack"| Detail
これがJetpack Compose NavigationのBottomNavを含む現実的なモデルです。
AIに渡す実用フォーマット
以下のフォーマットでClaude Codeに渡すと、UIフロー・状態・制約をまとめて伝えられます。
UI Flow (Mermaid):
flowchart TD
Home --> Detail
Detail -->|habitId必須| Edit
Edit -->|保存| Home
State:
- Home: listLoaded
- Detail: habitSelected
- Edit: formDirty
Constraint:
- Compose Material3
- state hoisting
- BottomNav: Home/Search/Profile
このフォーマットをClaude Codeに貼ると:
- Navigation設計のレビューができる
- ViewModel設計の提案が得られる
- UXフローの問題点を指摘してもらえる
よくあるミス
❌ 抽象すぎてわからない
flowchart TD
A --> B
B --> C
画面名が入っていないと何も伝わりません。
❌ UIと状態が分離されていない
画面遷移と状態変化を混在させると設計が見えにくくなります。Mermaidは「画面遷移」だけに絞るのが読みやすいです。
❌ タブを全部遷移で書こうとする
タブは状態切り替えなので、画面遷移として書くと構造が歪みます。subgraphやstate表現に留めます。
まとめ
| ポイント | 内容 |
|---|---|
| Mermaid推奨 | テキストでGit管理できAIに渡しやすい |
| 画面=ノード、遷移=矢印 | 最小単位はこれだけ |
| 条件・状態も書く | UXレビューに必要 |
| タブは状態として扱う | 「遷移」として書くと歪む |
| レイヤーを分けて管理 | Mermaid / state / ViewModel |
Mermaid + Claude Codeの組み合わせは、UIフロー設計を「AIと一緒に考えながら書く」ことを可能にします。figmaやスクショよりもずっと高速にイテレーションできます。