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