Skip to content

Commit 408d6f1

Browse files
authored
Merge pull request #93 from kiwicom/result-sharing-revert
Revert Result sharing polymorphic changes
2 parents 5e8a495 + 4bfbafb commit 408d6f1

File tree

5 files changed

+14
-32
lines changed

5 files changed

+14
-32
lines changed

Diff for: core/api/core.api

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public abstract interface class com/kiwi/navigationcompose/typed/ResultDestinati
2626
}
2727

2828
public final class com/kiwi/navigationcompose/typed/ResultSharingKt {
29-
public static final fun ResultEffectImpl (Landroidx/navigation/NavController;Ljava/lang/String;Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
30-
public static final fun setResultImpl (Landroidx/navigation/NavController;Lkotlinx/serialization/KSerializer;Lkotlinx/serialization/KSerializer;Ljava/lang/Object;)V
29+
public static final fun ResultEffectImpl (Landroidx/navigation/NavController;Ljava/lang/String;Lkotlinx/serialization/KSerializer;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;I)V
30+
public static final fun setResultImpl (Landroidx/navigation/NavController;Lkotlinx/serialization/KSerializer;Ljava/lang/Object;)V
3131
}
3232

3333
public final class com/kiwi/navigationcompose/typed/RoutingKt {

Diff for: core/src/main/kotlin/com/kiwi/navigationcompose/typed/ResultSharing.kt

+8-18
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ import kotlinx.serialization.serializer
2929
* }
3030
* ```
3131
*/
32-
@Suppress("unused") // T generic parameter is a typecheck for R being the type from ResultDestination
3332
@ExperimentalSerializationApi
3433
@Composable
35-
public inline fun <reified T : ResultDestination<R>, reified R : Any> ComposableResultEffect(
34+
public inline fun <reified R : Any> ComposableResultEffect(
3635
navController: NavController,
3736
noinline block: (R) -> Unit,
3837
) {
@@ -53,7 +52,6 @@ public inline fun <reified T : ResultDestination<R>, reified R : Any> Composable
5352
ResultEffectImpl(
5453
navController = navController,
5554
currentRoute = currentDestination.route!!, // routes are always not null in Nav Compose
56-
destinationSerializer = serializer<T>(),
5755
resultSerializer = serializer<R>(),
5856
block = block,
5957
)
@@ -73,18 +71,16 @@ public inline fun <reified T : ResultDestination<R>, reified R : Any> Composable
7371
* ) { result: Destinations.Dialog.Result ->
7472
* ```
7573
*/
76-
@Suppress("unused") // T generic parameter is a typecheck for R being the type from ResultDestination
7774
@ExperimentalSerializationApi
7875
@Composable
79-
public inline fun <reified T : ResultDestination<R>, reified R : Any> DialogResultEffect(
76+
public inline fun <reified R : Any> DialogResultEffect(
8077
currentRoutePattern: String,
8178
navController: NavController,
8279
noinline block: (R) -> Unit,
8380
) {
8481
ResultEffectImpl(
8582
navController = navController,
8683
currentRoute = currentRoutePattern,
87-
destinationSerializer = serializer<T>(),
8884
resultSerializer = serializer<R>(),
8985
block = block,
9086
)
@@ -96,18 +92,17 @@ public inline fun <reified T : ResultDestination<R>, reified R : Any> DialogResu
9692
@ExperimentalSerializationApi
9793
@PublishedApi
9894
@Composable
99-
internal fun <T : ResultDestination<R>, R : Any> ResultEffectImpl(
95+
internal fun <R : Any> ResultEffectImpl(
10096
navController: NavController,
10197
currentRoute: String,
102-
destinationSerializer: KSerializer<T>,
10398
resultSerializer: KSerializer<R>,
10499
block: (R) -> Unit,
105100
) {
106101
DisposableEffect(navController) {
107102
// The implementation is based on the official documentation of the Result sharing.
108103
// It takes into consideration the possibility of a dialog usage (see the docs).
109104
// https://developer.android.com/guide/navigation/navigation-programmatic#additional_considerations
110-
val resultKey = destinationSerializer.descriptor.serialName + "_result"
105+
val resultKey = resultSerializer.descriptor.serialName + "_result"
111106
val backStackEntry = navController.getBackStackEntry(currentRoute)
112107
val observer = LifecycleEventObserver { _, event ->
113108
if (event == Lifecycle.Event.ON_RESUME && backStackEntry.savedStateHandle.contains(resultKey)) {
@@ -129,24 +124,19 @@ internal fun <T : ResultDestination<R>, R : Any> ResultEffectImpl(
129124
* The result type has to be KotlinX Serializable.
130125
*/
131126
@ExperimentalSerializationApi
132-
@Suppress("unused") // generic parameter T is a type-check for R being a ResultDestination's type
133-
public inline fun <reified T : ResultDestination<R>, reified R : Any> NavController.setResult(
127+
public inline fun <reified R : Any> NavController.setResult(
134128
data: R,
135129
) {
136-
setResultImpl(serializer<T>(), serializer<R>(), data)
130+
setResultImpl(serializer(), data)
137131
}
138132

139133
@ExperimentalSerializationApi
140134
@PublishedApi
141-
internal fun <T : ResultDestination<R>, R : Any> NavController.setResultImpl(
142-
destinationSerializer: KSerializer<T>,
135+
internal fun <R : Any> NavController.setResultImpl(
143136
serializer: KSerializer<R>,
144137
data: R,
145138
) {
146-
// ResultDestination's serializer is used to identify the "key" in the map instead of Result's serializer.
147-
// This is to avoid issues with polymorphic result types -> setting a result with Result.Success would
148-
// generate a different key in comparison to just Result type used on the observation side.
149-
val resultKey = destinationSerializer.descriptor.serialName + "_result"
150139
val result = Json.encodeToString(serializer, data)
140+
val resultKey = serializer.descriptor.serialName + "_result"
151141
previousBackStackEntry?.savedStateHandle?.set(resultKey, result)
152142
}

Diff for: demo/src/main/kotlin/com/kiwi/navigationcompose/typed/demo/Destinations.kt

+1-7
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ internal sealed interface ProfileDestinations : Destination {
4545
@Serializable
4646
data object NameEditScreen : ProfileDestinations, ResultDestination<NameEditScreen.Result> {
4747
@Serializable
48-
sealed interface Result {
49-
@Serializable
50-
data class Success(val name: String) : Result
51-
52-
@Serializable
53-
data object Cancelled : Result
54-
}
48+
data class Result(val name: String)
5549
}
5650
}

Diff for: demo/src/main/kotlin/com/kiwi/navigationcompose/typed/demo/screens/NameEditScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import kotlinx.serialization.ExperimentalSerializationApi
1919
internal fun NameEditScreen(navController: NavController) {
2020
NameEdit(
2121
onNameSave = { name ->
22-
navController.setResult(ProfileDestinations.NameEditScreen.Result.Success(name))
22+
navController.setResult(ProfileDestinations.NameEditScreen.Result(name))
2323
navController.navigateUp()
2424
},
2525
)

Diff for: demo/src/main/kotlin/com/kiwi/navigationcompose/typed/demo/screens/Profile.kt

+2-4
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,8 @@ internal fun Profile(navController: NavController) {
3636
times += 1
3737
}
3838
ComposableResultEffect(navController) { result: ProfileDestinations.NameEditScreen.Result ->
39-
if (result is ProfileDestinations.NameEditScreen.Result.Success) {
40-
name = "Screen: ${result.name}"
41-
times += 1
42-
}
39+
name = "Screen: ${result.name}"
40+
times += 1
4341
}
4442

4543
Profile(name, times, navController::navigate)

0 commit comments

Comments
 (0)