Jetpack Compose: Navigation3 rememberNavBackStack とは何なのか

 

🤔 説明

  • 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 + SerializerrememberSerializable に渡している。


@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() は、@SerializablerememberSavable + Saver で保存できるようにしている。

ということで、

UI (@Composable) にナビゲーションのスタック状態の保持を任すのなら
rememberNavBackStack()
を使うと便利。

ということのようです。

画面回転やライフサイクルなどありますしね。

 

🤔 参考


Related Categories :  AndroidDevelopmemtJetpackComposeKotlinRecommendedTrending