Skip to content

Commit

Permalink
Merge pull request #92 from kiwicom/result-processing
Browse files Browse the repository at this point in the history
Fix NPE in result processing
  • Loading branch information
hrach authored Oct 27, 2023
2 parents 0438f61 + e0b7467 commit e75bc0c
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@ package com.kiwi.navigationcompose.typed

import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.navigation.NavController
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.first
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.Json
Expand All @@ -31,9 +36,23 @@ public inline fun <reified T : ResultDestination<R>, reified R : Any> Composable
navController: NavController,
noinline block: (R) -> Unit,
) {
// The async waiting workarounds situations when navController.currentBackStackEntry is null
// ~ not yet populated.
val currentDestinationState = remember(navController) {
mutableStateOf(navController.currentDestination)
}
val currentDestination = currentDestinationState.value
if (currentDestination == null) {
LaunchedEffect(navController) {
val currentBackStackEntry = navController.currentBackStackEntryFlow.filterNotNull().first()
currentDestinationState.value = currentBackStackEntry.destination
}
return
}

ResultEffectImpl(
navController = navController,
currentRoute = navController.currentDestination!!.route!!,
currentRoute = currentDestination.route!!, // routes are always not null in Nav Compose
destinationSerializer = serializer<T>(),
resultSerializer = serializer<R>(),
block = block,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ internal fun NameEditDialog(navController: NavController) {
NameEdit(
onNameSave = { name ->
navController.setResult(ProfileDestinations.NameEditDialog.Result(name))
navController.navigateUp()
navController.popBackStack()
},
onDismiss = navController::navigateUp,
onDismiss = navController::popBackStack,
)
}

Expand Down
16 changes: 15 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,9 @@ Another set of functionality is provided to support the result sharing. First, d

```kotlin
import com.kiwi.navigationcompose.typed.Destination
import com.kiwi.navigationcompose.typed.DialogResultEffect
import com.kiwi.navigationcompose.typed.ResultDestination
import com.kiwi.navigationcompose.typed.setResult

sealed interface Destinations : Destination {
@Serializable
Expand All @@ -164,7 +166,7 @@ sealed interface Destinations : Destination {

@Composable
fun Host(navController: NavController) {
ComposableResultEffect(navController) { result: Destinations.Dialog.Result ->
DialogResultEffect(navController) { result: Destinations.Dialog.Result ->
println(result)
// process the result
}
Expand All @@ -175,4 +177,16 @@ fun Host(navController: NavController) {
Text("Open")
}
}

@Composable
fun Dialog(navController: NavController) {
Button(
onClick = {
navController.setResult(Destinations.Dialog.Result(something = 42))
navController.popBackStack()
}
) {
Text("Set and close")
}
}
```

0 comments on commit e75bc0c

Please sign in to comment.