Search code examples
androidandroid-jetpack-composeandroid-lifecyclecomposable

Compose - How to know when a sub-composable has been rendered


Working on Compose, I'm trying to know when a sub-composable has been rendered to start my LaunchEffect

Here's a little snippet of what I'm trying to achieve :

fun MyCompo(
    screen: @Composable (Modifier) -> Unit,
) {
    val fr = remember { FocusRequester() }
    screen(Modifier.focusRequester(fr))

    LaunchEffect(Unit) {
        fr.requestFocus()
    }
}

My LaunchEffect is crashing because it's launched before screen() had time to render.

Any idea how to achieve this ? Thanks


Solution

  • How about adding a callback to your screen Composable and invoking it from LaunchedEffect from screen implementation? Does this work?

    @Composable
    fun MyComposable(
        screen: @Composable (Modifier, ()->Unit) -> Unit,
    ) {
        val fr = remember { FocusRequester() }
        screen(Modifier.focusRequester(fr)) {
            println("Child Composable")
        }
    
        LaunchedEffect(Unit) {
            println("Parent Composable")
    
            fr.requestFocus()
        }
    }
    

    And invoking it

    MyComposable { modifier, onComposed->
        Box(modifier = modifier
            .size(200.dp)
            .border(3.dp, Color.Red)) {
    
            LaunchedEffect(key1 = Unit){
                onComposed()
            }
        }
    

    }