iamthevoid
07/26/2021, 2:33 PMBindScopeWithComposable in [Thread].
BindScopeWithComposable (in my opinion) should remember result of provideComponent lambda between compositions even if i go to the next screen and back.
BindScopeWithComposable's used in the root of Compose navigation graph [Thread]. When i interact with one screen wrapped in BindScopeWithComposable then component instance stay the same. But when i go to the next screen and back it is recomposing and new instance of component now used.iamthevoid
07/26/2021, 2:33 PM@Composable
fun <Component : Scoped> BindWithScoped(
provideComponent: () -> Component,
content: @Composable (Component) -> Unit
) {
val component by remember(provideComponent) {
mutableStateOf(provideComponent())
}
val observer by remember(component) {
mutableStateOf(ScopeCloseLifecycleObserver(component.getScope()))
}
LocalLifecycleOwner.current.lifecycle.addObserver(observer)
content(component)
}iamthevoid
07/26/2021, 2:34 PM@Composable
private fun Navigation(events: Events, stateProvider: StateProvider) {
val navController: NavHostController = rememberNavController()
NavHost(
navController = navController,
startDestination = Screen.AuthorizationEnterPhone.route
) {
composable(Screen.AuthorizationEnterPhone) {
BindWithScoped(provideComponent = events::authorizationEnterPhoneEvents) {
AuthorizationEnterPhoneScreen(
events = it,
state = stateProvider.getAuthorizationRequisiteState(),
...
)
}
}
composable(Screen.AuthorizationEnterCode) {
it.arguments?.onAuthorizationEnterCodeData { phone ->
BindWithScoped(provideComponent = events::authorizationEnterCodeEvents) { codeEvents ->
AuthorizationEnterCodeScreen(
events = codeEvents,
stateProvider.getAuthorizationEnterCodeState(phone),
...
)
}
}
}
}
}iamthevoid
07/26/2021, 2:35 PMthinking in compose is constant, and not changes between recompositions, but when i use it as key in remember function it is not preserve remember factory resultIan Lake
07/26/2021, 3:46 PMrememberSaveable) and ViewModels (i.e., viewModel()) are the only things kept around