
🤔 説明
- Jetpack Compose の Navigation3 における「ナビゲーション履歴(バックスタック)を状態として保持・復元する仕組み」
- 画面遷移の履歴を Composable 内で安全に持てる
- タブ切り替えや再構成でも状態を失わない
🤔 コードを見てみる
@Composable
public fun rememberNavBackStack(vararg elements: NavKey): NavBackStack<NavKey> {
return rememberSerializable(
serializer = NavBackStackSerializer(elementSerializer = NavKeySerializer())
) {
NavBackStack(*elements)
}
}
@Serializable(with = NavBackStackSerializer::class)
public class NavBackStack<T : NavKey> public constructor(internal val base: SnapshotStateList<T>) :
MutableList<T> by base, StateObject by base, RandomAccess by base {
public constructor() : this(base = mutableStateListOf())
public constructor(vararg elements: T) : this(base = mutableStateListOf(*elements))
}
RememberNavBackStack.kt - Android Code Search
NavBackStack.kt - Android Code Search
👉️ rememberNavBackStack() は、rememberSerializavle + Serializer で rememberSerializable に渡している。
@Composable
public fun <T : Any> rememberSerializable(
vararg inputs: Any?,
serializer: KSerializer<T>,
configuration: SavedStateConfiguration = DEFAULT,
init: () -> T,
): T {
val saver = serializableSaver(serializer, configuration)
@Suppress("DEPRECATION")
return rememberSaveable(*inputs, saver = saver, key = null, init = init)
}
RememberSerializable.kt - Android Code Search
👉️ rememberSeriarizable() は、@Serializable を rememberSavable + Saver で保存できるようにしている。
ということで、
UI (@Composable) にナビゲーションのスタック状態の保持を任すのなら
rememberNavBackStack()
を使うと便利。
ということのようです。
画面回転やライフサイクルなどありますしね。
🤔 参考
Related Categories : Android・Developmemt・JetpackCompose・Kotlin・Recommended・Trending