Jetpack 重组行为

Jetpack recomposition behavior

当状态改变时,应该触发重组。在代码示例中,一种状态发生变化但不会触发重组,但在代码示例中,两种状态发生变化 onButtonClick 并触发重组。

如何使代码示例一在状态更改时重构?

  1. 下面的代码不会触发重组
@Composable
fun doSomething(){
    val context = LocalContext.current
    val scope = rememberCoroutineScope()
    var shouldDo by remember{ mutableStateOf(false) }

    LaunchedEffect(context){
        scope.launch(Dispatchers.Default){
            //Fetch a data from dataSource
            //then change the state
            withContext(Dispatchers.Main){
                shouldDo = true
            }
        }
    }
    //Process the data when @shouldDo state changes to true
    if(shouldDo){
        Log.e("=======================", "shouldDo: $shouldDo")
    }
}
  1. 但是此代码会在单击按钮时触发重组
@Composable
fun doSomeOtherThing() {
    var shouldDo by remember{ mutableStateOf(false) }
    if(shouldDo){
        Log.e("=======================", "shouldDo: $shouldDo")
    }
    Box(modifier = Modifier.fillMaxSize()){
        Button(
            modifier = Modifier.align(Alignment.Center),
            onClick = {
                shouldDo = true
            }
        ) {
            Text(text = "Button")
        }
    }
}

How to make code sample one to recompose on state change?

您应该在第一次合成期间使用 SideEffect 来改变状态,以使这些更改“生效”:

@Composable
fun doSomething() {
    var shouldDo by remember { mutableStateOf(false) }
    if (shouldDo) {
        Log.e("=======================", "shouldDo: $shouldDo")
    }

    SideEffect {
        shouldDo = true
    }
}

进一步阅读:https://developer.android.com/jetpack/compose/side-effects