From 5fffb6fb34aa9f17be13166e36e8d4171a1d307a Mon Sep 17 00:00:00 2001 From: Arkadii Ivanov Date: Sun, 27 Nov 2022 14:10:52 +0000 Subject: [PATCH] Added children convenience method with Parcelable navigation state --- .../router/children/ChildrenFactory.kt | 30 +++++++++++++++++++ .../DefaultCustomNavigationComponent.kt | 8 ++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/decompose/src/commonMain/kotlin/com/arkivanov/decompose/router/children/ChildrenFactory.kt b/decompose/src/commonMain/kotlin/com/arkivanov/decompose/router/children/ChildrenFactory.kt index 5a3bce3bf..6bcf563bf 100644 --- a/decompose/src/commonMain/kotlin/com/arkivanov/decompose/router/children/ChildrenFactory.kt +++ b/decompose/src/commonMain/kotlin/com/arkivanov/decompose/router/children/ChildrenFactory.kt @@ -12,6 +12,7 @@ import com.arkivanov.essenty.lifecycle.doOnDestroy import com.arkivanov.essenty.parcelable.Parcelable import com.arkivanov.essenty.parcelable.ParcelableContainer import com.arkivanov.essenty.parcelable.Parcelize +import com.arkivanov.essenty.parcelable.consumeRequired import com.arkivanov.essenty.statekeeper.consume /** @@ -133,6 +134,35 @@ fun , S : Any> ComponentContext.child return state } +/** + * A convenience method for the main [children] method. Allows having [Parcelable] navigation state [N], + * so it's automatically saved and restored. This method can be used if the custom save/restore logic + * is not required. + */ +@ExperimentalDecomposeApi +inline fun ComponentContext.children( + source: NavigationSource, + key: String, + noinline initialNavState: () -> N, + noinline navTransformer: (navState: N, event: E) -> N, + noinline onEventComplete: (event: E, newNavState: N, oldNavState: N) -> Unit, + noinline backTransformer: (navState: N) -> (() -> N)?, + noinline stateMapper: (navState: N, children: List>) -> S, + noinline childFactory: (configuration: C, componentContext: ComponentContext) -> T, +): Value where N : NavState, N : Parcelable = + children( + source = source, + key = key, + initialNavState = initialNavState, + saveNavState = { ParcelableContainer(it) }, + restoreNavState = { it.consumeRequired(N::class) }, + navTransformer = navTransformer, + onEventComplete = onEventComplete, + backTransformer = backTransformer, + stateMapper = stateMapper, + childFactory = childFactory, + ) + @Parcelize private class SavedState( val navState: ParcelableContainer, diff --git a/sample/shared/shared/src/commonMain/kotlin/com/arkivanov/sample/shared/customnavigation/DefaultCustomNavigationComponent.kt b/sample/shared/shared/src/commonMain/kotlin/com/arkivanov/sample/shared/customnavigation/DefaultCustomNavigationComponent.kt index d53571131..4b9f1c848 100644 --- a/sample/shared/shared/src/commonMain/kotlin/com/arkivanov/sample/shared/customnavigation/DefaultCustomNavigationComponent.kt +++ b/sample/shared/shared/src/commonMain/kotlin/com/arkivanov/sample/shared/customnavigation/DefaultCustomNavigationComponent.kt @@ -10,9 +10,7 @@ import com.arkivanov.decompose.router.children.SimpleNavigation import com.arkivanov.decompose.router.children.children import com.arkivanov.decompose.value.Value import com.arkivanov.essenty.parcelable.Parcelable -import com.arkivanov.essenty.parcelable.ParcelableContainer import com.arkivanov.essenty.parcelable.Parcelize -import com.arkivanov.essenty.parcelable.consumeRequired import com.arkivanov.sample.shared.customnavigation.CustomNavigationComponent.Children import com.arkivanov.sample.shared.customnavigation.CustomNavigationComponent.Mode import com.arkivanov.sample.shared.customnavigation.KittenComponent.ImageType @@ -24,8 +22,8 @@ class DefaultCustomNavigationComponent( private val navigation = SimpleNavigation<(NavigationState) -> NavigationState>() - private val _children = - children NavigationState, NavigationState, Children>( + private val _children: Value> = + children( source = navigation, key = "carousel", initialNavState = { @@ -37,8 +35,6 @@ class DefaultCustomNavigationComponent( mode = Mode.CAROUSEL, ) }, - saveNavState = ::ParcelableContainer, - restoreNavState = { it.consumeRequired(NavigationState::class) }, navTransformer = { navState, transformer -> transformer(navState) }, onEventComplete = { _, _, _ -> }, backTransformer = {