Hi, could you to explain me why am i not getting t...
# compose
i
Hi, could you to explain me why am i not getting the result, what want to get. Code of
BindScopeWithComposable
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.
Copy code
@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)
}
Copy code
@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),
                        ...
                    )
                }
            }
        }
    }
}
Lambda in
thinking 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 result
i
Your screen's composition is disposed when it is on the back stack (that composition is no longer part of your UI when you're on a different screen). When on the back stack, your state (i.e.,
rememberSaveable
) and ViewModels (i.e.,
viewModel()
) are the only things kept around
👍 1