Kotlin

Jetpack Compose 最新概念とデザインパターン(2025/2026年版)

ⓘ本ページはプロモーションが含まれています

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


スポンサードリンク

Material 3 とテーマシステムの進化

背景と主な特徴

  • Material 3 (Material You) は Android 12(Monet)で導入された動的カラー機能をベースに、ライト / ダーク / ハイコントラスト の自動切替を標準実装しています。
  • Compose 用 material3 ライブラリは MaterialTheme を拡張 し、色・タイポグラフィ・形状(Shape)をすべてコードで一元管理できます。公式ドキュメント: https://developer.android.com/jetpack/compose/themes/material3

実装例:アプリ全体に適用できるテーマ関数

  • dynamicLightColorScheme() / dynamicDarkColorScheme()Monet に基づく色を自動生成します。
  • カスタムの Typography を定義することで、フォントサイズ・ウェイト の統一が可能です。

使いどころ

シナリオ 効果
新規プロジェクト開始時 テーマ設定だけで UI 全体に一貫したデザインを適用
既存アプリのマイグレーション MaterialTheme の呼び出しを書き換えるだけで Material 3 に移行可能
ブランドカラーが頻繁に変わるケース ColorScheme を外部リソース(JSON 等)から生成し、テーマ関数だけ差し替えれば即反映

Compose Compiler のインクリメンタルビルド最適化

何が変わったか

  • Compose Compiler 1.5.0 以降で インクリメンタルコンパイル がデフォルト有効化されました(公式リリースノート: https://developer.android.com/jetpack/compose/compiler)。
  • 再ビルド時に変更があった箇所だけを再コンパイルするため、ビルド時間の短縮IDE の応答性向上 が期待できます。具体的な数値はプロジェクト構成やハードウェアに依存しますが、実際に 10 % 前後の改善が報告されています(Google I/O 2024 発表スライド参照)。

@Stable アノテーションで再コンポジションを抑制

  • UiState不変(Immutable) であることをコンパイラに明示すると、内部プロパティが変更されたときだけ UI が再評価されます。
  • 大規模リストや頻繁に状態が変わる画面で特に有効です。

注意点

項目 対策
@Stable の付与漏れ データクラスは基本的に data class だけで十分ですが、Mutable なプロパティが混在する場合は手動で @Stable を付与
インクリメンタルコンパイルの無効化 gradle.propertiesandroid.compose.compiler.enableNonIncremental=true と書くとオフになるので、意図しない設定変更に注意

状態管理パターン:State Hoisting → ViewModel + StateFlow → MVI

1. State Hoisting(状態の持ち上げ)

  • 目的: Composable を ステートレス に保ち、状態は外部(主に ViewModel)で保持する。
  • 効果: UI とロジックが分離され、テストしやすくなる。

2. ViewModel + StateFlow(単一データソース)

  • StateFlowCold Stream で、画面が観測を開始した瞬間に最新状態を流すため、Compose の collectAsState() と相性が良いです。

3. MVI(Model‑View‑Intent)へのステップアップ

コンポーネント 説明
Intent UI が送出するユーザー操作(例: ボタンタップ)。
Reducer Intent と現在の State を受け取り、新しい State を返す純粋関数。
ViewModel Reducer の結果を StateFlow に流し、UI はそれを購読するだけ。

  • テスト容易性: reduce 関数だけを単体テストすれば、ロジックの正しさが保証できる。UI 層は ViewModel が提供する State を表示するだけになるため、UI テストは「表示結果」だけに集中できる。

コードで構築するモダンデザインシステム

カスタムカラー・タイポグラフィの定義

  • ポイント: CustomTheme をアプリのエントリーポイント(例: MainActivity.setContent) にラップすれば、全画面で同一デザイン基準が適用されます。

再利用可能なコンポーネントと CompositionLocal

  • 呼び出し側で CompositionLocalProvider を使えば、画面単位・モジュール単位で微調整 が可能です。


実務で頻出する UI パターン例(リスト‑詳細・タブナビゲーション)

1. マスター‑ディテール画面(Responsive)

実装のポイント

条件 推奨コンポーネント
幅が Expanded (tablet, foldable) Row + LazyColumn / DetailPane を同時表示
幅が Compact (スマートフォン) NavHost で画面遷移

コード例

  • calculateWindowSizeClass()androidx.window:window ライブラリのユーティリティで、画面幅に応じたサイズクラスを取得できます。

2. タブ + カードベースレイアウト

実装のポイント

画面幅 UI コンポーネント
Medium 以上 NavigationRail(縦型タブ)
Compact TabRow(横型タブ)

  • LazyVerticalGridAdaptive モードにより、画面幅が変わっても最適な列数が自動で決まります。

パフォーマンス最適化とテスト戦略

Lazy 系コンポーネントのベストプラクティス

テクニック 効果
LazyListState の保存・復元 画面遷移後もスクロール位置を保持し、ユーザー体験が向上
アイテムキー (key) を明示指定 再利用時に不必要な再描画を防止
Paging 3 と組み合わせた無限スクロール 大量データでもメモリ使用量を抑えつつ、スムーズなロードが可能

Compose Test の基本構成

  • hasTestTag は UI 要素に付与した Modifier.testTag() を検索するのに便利です。
  • テストは ロジックと UI の分離 が前提なので、ViewModel にモックデータを流すだけで実装できます。

CI への組み込み(GitHub Actions の例)

  • 上記設定だけで ユニットテスト、Compose UI テスト、Lint が自動実行され、品質が継続的に保たれます。

プロジェクトへの導入手順(ステップバイステップ)

  1. リポジトリを取得

bash
git clone https://github.com/your-org/compose-design-system.git
cd compose-design-system

  1. Compose の最新安定版を設定
    build.gradle.kts に以下を追記(2025 年 4 月時点の最新版は 1.5.10):

kotlin
android {
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.10"
}
}

dependencies {
implementation("androidx.compose.material3:material3:1.2.0")
// WindowManager と Paging の依存関係も忘れずに
implementation("androidx.window:window:1.2.0")
implementation("androidx.paging:paging-compose:3.2.0")
}

  1. デザインシステムモジュールを組み込む
  2. designsystem フォルダにある CustomTheme.ktAppCard.kt をプロジェクトの共通モジュールへコピー。
  3. アプリ側 build.gradle.ktsimplementation(project(":designsystem")) を追加。

  4. UI パターンサンプルを自プロジェクトにマージ

サンプルファイル 目的
MasterDetailSample.kt 幅に応じたレイアウト切替
TabAndCardSample.kt タブ / NavigationRail とカードグリッドの実装例
  1. テストコードを移植
  2. test/compose ディレクトリにあるテストクラスを自プロジェクトの androidTest にコピー。
  3. FakeListViewModel などのスタブは自アプリのデータ構造に合わせて調整。

  4. CI 設定の追加(既存リポジトリに GitHub Actions が無い場合)

bash
mkdir -p .github/workflows
# 上記 YAML を .github/workflows/android-ci.yml に保存

  1. ビルドとテストの実行確認

bash
./gradlew clean assembleDebug testDebugUnitTest

すべてが成功すれば、最新 Material 3 と Compose Compiler の最適化を活用したデザインシステム がプロジェクトに組み込まれた状態です。


まとめ

項目 主な効果
Material 3 + カスタムテーマ コードだけで一貫した UI デザインを実現し、動的カラーにも対応
Compose Compiler のインクリメンタルビルド 再コンパイル時間が短縮され、開発効率が向上(具体的な数値は環境依存)
状態管理の段階的導入 (State HoistingViewModel+StateFlowMVI) ロジックのテスト容易性と UI の保守性が大幅に改善
CompositionLocal + Modifier によるコンポーネント再利用 プロジェクト全体でデザインガイドラインをコードとして統一
Responsive な UI パターン(Master‑Detail、Tab/NavigationRail) 画面サイズに応じた最適なレイアウト切替がシンプルに実装可能
Lazy 系コンポーネントと Paging の併用 大量データでもメモリ使用を抑えつつスムーズなスクロール体験
Compose Test と CI 連携 UI テストが自動化され、品質保証が継続的に行える

これらのベストプラクティスとコードスニペットは、2025 年時点で安定提供されている Jetpack Compose の機能を最大限活用するための実務向きガイドです。プロジェクトに適宜取り入れることで、開発速度・保守性・ユーザー体験 を同時に向上させることができます。

スポンサードリンク

お得なお知らせ

スポンサードリンク
AI時代のキャリア構築

プログラミング学習、今日から動き出す

「何から始めるか」で止まっている人こそ、無料説明会や本で自分に合うルートを30分で確定できます。

Enjoy Tech!|月額制でWeb系に強い▶ (Kindle本)ITエンジニアの転職学|後悔しないキャリア戦略▶

▶ AIコーディング環境なら  実践Claude Code入門(Amazon)が実務で即使える入門書です。Amazonベストセラーにも選ばれていますよ。


-Kotlin