SceneStrategyScope



Scope used to create a Scene from a list of NavEntrys.

This Scope should be provided to the SceneStrategy.calculateScene function to create Scenes.

Summary

Public constructors

<T : Any> SceneStrategyScope(onBack: () -> Unit)
Cmn

Public properties

() -> Unit

A callback that should be connected to any internal handling of system back done by the returned Scene.

Cmn

Public constructors

SceneStrategyScope

<T : Any> SceneStrategyScope(onBack: () -> Unit = {})

Public properties

onBack

val onBack: () -> Unit

A callback that should be connected to any internal handling of system back done by the returned Scene.

For example, if your Scene uses a separate window that handles system back itself or if the UI present in your Scene allows users to go back via a custom gesture or affordance, this callback allows you to bubble up that event to the SceneState / androidx.navigation3.ui.NavDisplay that interfaces with the developer owned back stack.

import androidx.compose.runtime.Composable
import androidx.compose.ui.window.Dialog
import androidx.navigation3.runtime.NavEntry
import androidx.navigation3.scene.OverlayScene
import androidx.navigation3.scene.Scene
import androidx.navigation3.scene.SceneStrategy
import androidx.navigation3.scene.SceneStrategyScope

/** Class that shows a [NavEntry] as a [Dialog]. */
class SimpleDialogScene<T : Any>(
    private val entry: NavEntry<T>,
    override val previousEntries: List<NavEntry<T>>,
    onBack: () -> Unit,
) : OverlayScene<T> {
    override val key = entry.contentKey
    override val entries = listOf(entry)
    override val overlaidEntries = previousEntries

    override val content: @Composable () -> Unit = {
        Dialog(onDismissRequest = onBack) { entry.Content() }
    }
}

/**
 * A [SceneStrategy] that shows every screen above the first one as a dialog.
 *
 * In a real example, you'd have developers opt into displaying their entry as a dialog by
 * providing a companion method that provides [NavEntry.metadata].
 *
 * @see androidx.navigation3.scene.DialogSceneStrategy
 */
class SimpleDialogSceneStrategy<T : Any> : SceneStrategy<T> {
    override fun SceneStrategyScope<T>.calculateScene(entries: List<NavEntry<T>>): Scene<T>? {
        val entry = entries.lastOrNull() ?: return null
        val previousEntries = entries.dropLast(1)
        // Only show this as a dialog if there is something 'underneath' the dialog
        return if (previousEntries.isNotEmpty()) {
            SimpleDialogScene(entry, previousEntries, onBack)
        } else {
            null
        }
    }
}