
Jetpack Compose の次世代ナビゲーションライブラリ Navigation3 では、従来の NavHost と文字列ベースのルート定義から脱却し、より "Compose らしい" 状態管理へと進化しました。
その中核を担うのが rememberNavBackStack です。今回は、この新しい API の「型」の意味と、それを使った最小構成のサンプルコードを解説します。
🧑🏻💻 rememberNavBackStack の型とその正体
まず、この関数が何を返しているのかを確認しましょう。
val backStack: SnapshotStateList<T> = rememberNavBackStack(initialBackStack)
この関数が返す型は、Compose 独自の SnapshotStateList
🧑🏻💻 なぜこの型なのか?
オブザーバブル(監視可能): SnapshotStateList は、リストの中身(要素の追加や削除)が変化したことを Compose のランタイムに通知します。これにより、スタックを操作した瞬間に NavDisplay が自動的に再描画されます。
保存と復元: rememberNavBackStack は内部で rememberSaveable の仕組みを利用しています。つまり、画面回転やプロセスの再起動が発生しても、ナビゲーションの履歴(スタック)が消えずに保持されることを意味します。
直感的な List 操作: MutableList インターフェースを継承しているため、開発者は add()、removeLast()、clear() といった標準的なメソッドで遷移をコントロールできます。
🧑🏻💻 実装サンプル
1. 画面(デスティネーション)の定義
スタックに積むデータ型を sealed interface で定義します。
sealed interface Screen {
data object Home : Screen
data class Details(val id: String) : Screen
}
2. ナビゲーションの構築
@Composable
fun MyNavigationApp() {
// initialBackStack で最初の画面を指定
// 戻り値はスタックの状態を保持する SnapshotStateList<Screen>
val backStack = rememberNavBackStack(initialBackStack = listOf(Screen.Home))
NavDisplay(
backstack = backStack,
onBack = {
// スタックが2つ以上あれば、最後の要素を取り除いて「戻る」
if (backStack.size > 1) {
backStack.removeLast()
}
}
) { screen ->
when (screen) {
is Screen.Home -> HomeScreen(
onNavigateToDetails = { id ->
// 1. 新しい画面をスタックに add するだけ
backStack.add(Screen.Details(id))
}
)
is Screen.Details -> DetailsScreen(
id = screen.id,
onBack = {
// 2. 現在の画面を remove するだけで戻れる
backStack.removeLast()
}
)
}
}
}
🧑🏻💻 まとめ
Navigation3 において、rememberNavBackStack は単なる「履歴リスト」ではなく、「アプリの現在の状態そのもの」を管理するハブです。
型安全: 任意のオブジェクト(Screen)をスタックに積める。
宣言的: スタックの状態が変われば、UI(NavDisplay)が同期して変わる。
堅牢: SnapshotStateList により、構成変更(回転など)にも強い。
これまでの NavController による命令的な遷移から、「スタックというデータを操作する」という Compose 本来の作法へ。Navigation3 は開発体験を大きくシンプルにしてくれます。
Related Categories : Android・AndroidStudio・Developmemt・JetpackCompose・Kotlin・Trending