SceneStrategyScope
public final class SceneStrategyScope<T extends Object>
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 extends Object> SceneStrategyScope()Construct a |
Public methods |
|
|---|---|
final @NonNull Function0<Unit> |
A callback that should be connected to any internal handling of system back done by the returned |
Public constructors
SceneStrategyScope
public <T extends Object> SceneStrategyScope()
Construct a SceneStrategyScope suitable for calling SceneStrategy.calculateScene in isolation.
For more complicated cases, such as ones where you want to test if onBack is called correctly, use rememberSceneState, which will construct its own internal SceneStrategyScope suitable for a Scene that closely mirror real scenarios and be passed to androidx.navigation3.ui.NavDisplay.
Public methods
getOnBack
public final @NonNull Function0<Unit> getOnBack()
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 } } }