Home > Enterprise >  Android Jetpack Compose rememberSystemUiController() doesn't observe mutableStateOf()
Android Jetpack Compose rememberSystemUiController() doesn't observe mutableStateOf()

Time:10-22

I'm trying to achieve a hide/show functionality for status bar in an AbstractComposeView

class MyView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AbstractComposeView(context, attrs, defStyleAttr) {
    private val hide = mutableStateOf(false)
    var hideBars: Boolean
        get() = hide.value
        set(value) { hide.value = value }
    @Composable
    override fun Content() {
        val systemUiController = rememberSystemUiController()
        SideEffect {
            systemUiController.isStatusBarVisible = !hide.value
        }
        setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnDetachedFromWindow)
        Launch()
    }
}

When setting hideBars = true/false it's not having any effect

view.findViewById<MyView>(R.id.my_view).hideBars = true

Any suggestions or workarounds?

CodePudding user response:

SideEffect is just that - a side effect of something else causing a recomposition - changes to values read inside SideEffect do not cause recompositions themselves.

Instead, you should consider using LaunchedEffect, which runs every time the key passed to it changes:

LaunchedEffect(hide.value) {
    systemUiController.isStatusBarVisible = !hide.value
}
  • Related