LoginSignup
0
0

More than 1 year has passed since last update.

サンプルアプリでJetpack Compose Navigationの実装を学ぶ

Posted at

以下の文言は、AI (ChatGPT4) による出力結果です。そのため内容が一部不正確である可能性があります。

この記事では、dignicate/zero-2023-android というサンプルアプリを題材に、以下の内容を解説します。

  • アプリの内容を簡潔に説明
  • Compose Navigation による画面遷移
  • 独自拡張
    • ComposeNavigator
    • ComposeScreen

アプリの内容

サンプルアプリは、ユーザーがアイテムを選択し、その詳細を表示するシンプルなアプリです。アプリは以下の2つの画面で構成されています。

  1. アイテム一覧画面
  2. アイテム詳細画面

ユーザーがアイテム一覧画面でアイテムをタップすると、アイテム詳細画面に遷移します。

Compose Navigation による画面遷移

このサンプルアプリでは、Jetpack ComposeとCompose Navigationを使って画面遷移を実装しています。NavHostを使って画面遷移のルートを定義しています。

@Composable
fun AppNavigator() {
    val navController = rememberNavController()
    NavHost(navController, startDestination = ComposeScreen.ListScreen.route) {
        composable(ComposeScreen.ListScreen.route) {
            ItemListScreen(navController)
        }
        composable(ComposeScreen.DetailScreen.route) { backStackEntry ->
            val itemId = backStackEntry.arguments?.getString("itemId") ?: ""
            ItemDetailScreen(navController, itemId)
        }
    }
}

(ソースコード: MainActivity.kt, Line 25-37)

ItemListScreenとItemDetailScreenは、それぞれアイテム一覧画面とアイテム詳細画面を表しています。遷移先としてComposeScreenを使っています。

独自拡張

このサンプルアプリでは、独自の拡張を使って画面遷移を実現しています。この拡張は How to Trigger Navigation in Jetpack Compose Outside of Composables を参考にしています。

ComposeNavigator
ComposeNavigatorは、画面遷移をトリガーする機能を提供します。ComposeNavigatorを使って、画面遷移を起こすイベントをNavHostに伝えることができます。

object ComposeNavigator {
    private val _navigationEvent = MutableSharedFlow<ComposeScreen>()
    val navigationEvent = _navigationEvent.asSharedFlow()

    fun navigateTo(screen: ComposeScreen) {
        _navigationEvent.tryEmit(screen)
    }
}

(ソースコード: ComposeNavigator.kt, Line 8-16)

ComposeScreen

ComposeScreenは、画面遷移に必要な情報を保持するデータクラスです。遷移先の画面とそのルートを定義しています。

sealed class ComposeScreen(val route: String) {
    object ListScreen : ComposeScreen("listScreen")
    object DetailScreen : ComposeScreen("detailScreen/{itemId}") {
        fun createRoute(itemId: String) = "detailScreen/$itemId"
    }
}

(ソースコード: ComposeScreen.kt, Line 5-10)

画面遷移の際には、ComposeNavigator.navigateTo() を使って ComposeScreen を引数に渡します。例えば、アイテム一覧画面からアイテム詳細画面に遷移する場合、次のように記述します。

Button(onClick = {
    ComposeNavigator.navigateTo(ComposeScreen.DetailScreen.createRoute(item.id))
}) {
    Text("詳細")
}

(ソースコード: ItemListScreen.kt, Line 26-30)

このように、独自拡張を使用することで、Jetpack Compose Navigation を柔軟に扱うことができます。今回のサンプルアプリを通して、Compose Navigation の基本的な使い方と独自拡張の活用方法を学ぶことができました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0