Florian
08/05/2021, 9:42 PMcomposable(TodoScreen.TodoList.name) { navBackStackEntry ->
TodoListScreen(
[...]
addEditResult = navBackStackEntry.savedStateHandle.get<Int>(KEY_ADD_EDIT_RESULT)
)
}
As far as I see, I will always receive this result on every recomposition (like when the screen is rotated) causing to show feedback snackbars again.Ian Lake
08/05/2021, 9:44 PMIf you’d only like to handle a result only once, you must callon theremove()
to clear the result.SavedStateHandle
Florian
08/05/2021, 9:45 PMFlorian
08/05/2021, 9:45 PMIan Lake
08/05/2021, 9:46 PMnavBackStackEntry.savedStateHandle
, you need to call remove()
on navBackStackEntry.savedStateHandle
, yesFlorian
08/05/2021, 9:46 PMFlorian
08/05/2021, 10:03 PMNavHost(
navController = navController,
startDestination = TodoScreen.TodoList.name,
modifier = modifier
) {
composable(TodoScreen.TodoList.name) { navBackStackEntry ->
val addEditResult = navBackStackEntry.savedStateHandle.get<Int>(KEY_ADD_EDIT_RESULT)
navBackStackEntry.savedStateHandle.remove<Int>(KEY_ADD_EDIT_RESULT)
TodoListScreen(
onTodoEditClicked = { todo ->
navController.navigate("${TodoScreen.AddEditTodo.name}?todoId=${todo.id}")
},
onFabAddNewTodoClicked = {
navController.navigate(TodoScreen.AddEditTodo.name)
},
addEditResult = addEditResult
)
}
Ian Lake
08/05/2021, 10:27 PMremove
) as part of composition - generally you'd want to handle events through one of the Effects
APIsIan Lake
08/05/2021, 10:29 PMaddEditResult
will be null again (because you removed it), thus caling your TodoListScreen
to be passed null again. That seems to imply that you only care about a single composition happening with a valid result, which feels weird?Ian Lake
08/05/2021, 10:29 PMIan Lake
08/05/2021, 10:40 PMFlorian
08/05/2021, 10:50 PMDisposableEffect(addEditResult) {
if (addEditResult != null) {
viewModel.onAddEditResult(addEditResult)
}
onDispose {}
}
Florian
08/05/2021, 10:51 PMIan Lake
08/05/2021, 10:52 PMonAddEditResult
returnsFlorian
08/05/2021, 10:53 PMFlorian
08/05/2021, 10:53 PMIan Lake
08/05/2021, 10:53 PMSavedStateHandle
down (so you could call remove
directly) or passing in a lambda parameter that would call remove
when it firesIan Lake
08/05/2021, 10:55 PMTodoListScreen(
onTodoEditClicked = { todo ->
navController.navigate("${TodoScreen.AddEditTodo.name}?todoId=${todo.id}")
},
onFabAddNewTodoClicked = {
navController.navigate(TodoScreen.AddEditTodo.name)
},
addEditResult = navBackStackEntry.savedStateHandle.get<Int>(KEY_ADD_EDIT_RESULT)
onAddEditResultProcessed = {
navBackStackEntry.savedStateHandle.remove(KEY_ADD_EDIT_RESULT)
}
)
Florian
08/05/2021, 10:56 PMFlorian
08/05/2021, 11:06 PM@Composable
fun TodoListScreen(
[...]
addEditResult: Int?,
onAddEditResultProcessed: () -> Unit
) {
[...]
DisposableEffect(addEditResult) {
if (addEditResult != null) {
viewModel.onAddEditResult(addEditResult)
onAddEditResultProcessed()
}
onDispose {}
}
[...]
}
Ian Lake
08/05/2021, 11:31 PMFlorian
08/05/2021, 11:38 PM