mattinger
10/21/2021, 2:19 PMmattinger
10/21/2021, 2:28 PMdata class PageViewState(
val startTime: Long = System.currentTimeMillis(),
val route: String = ""
)
@Composable
fun rememberMutablePageViewState(initialRoute: String = "") = remember {
mutableStateOf(PageViewState(route = initialRoute))
}
fun MutableState<PageViewState>.attachToNavController(navController: NavHostController) {
navController.addOnDestinationChangedListener(PageViewStateDestinationListener(this))
}
fun PageViewStateDestinationListener(pageViewState: MutableState<PageViewState>) =
NavController.OnDestinationChangedListener { _, destination, _ ->
pageViewState.value = pageViewState.value.copy(route = destination.route ?: "")
}
@Composable
fun PageViewStateSideEffect(pageViewState: PageViewState) {
SideEffect {
Timber.tag("PageEnter").d(pageViewState.toString())
}
}
mattinger
10/21/2021, 2:29 PMmattinger
10/21/2021, 2:31 PMmattinger
10/21/2021, 2:34 PMmattinger
10/21/2021, 2:38 PMIan Lake
10/21/2021, 3:08 PMIan Lake
10/21/2021, 3:18 PMSideEffect
runs every single composition, which is most certainly not what you want for event loggingIan Lake
10/21/2021, 3:23 PMcurrentBackStackEntryFlow
, not any listener at all:
val navController = rememberNavController()
LaunchedEffect(navController) {
navController.currentBackStackEntryFlow.mapNotNull { backStackEntry ->
backStackEntry.destination.route
}.distinctUntilChanged().map { destinationRoute ->
PageViewState(route = destinationRoute)
}.collect { pageViewState ->
Timber.tag("PageEnter").d(pageViewState.toString())
}
}
NavHost(...) {
...
}
mattinger
10/21/2021, 7:11 PMmattinger
10/21/2021, 7:12 PMnavController.addOnDestinationChangedListener { _, destination, _ ->
...
}
mattinger
10/21/2021, 7:13 PMmattinger
10/21/2021, 7:17 PMIan Lake
10/21/2021, 7:28 PMaddOnDestinationChangedListener
as part of compositionIan Lake
10/21/2021, 7:29 PMDisposableEffect
that removes the listener when the composition is removedIan Lake
10/21/2021, 7:30 PMcollect
automatically cleans itself upIan Lake
10/21/2021, 7:36 PMdistinctUntilChanged()
, which you get for free with all of the many flow operationsmattinger
10/22/2021, 3:03 PM