Jetpack 重组行为
Jetpack recomposition behavior
当状态改变时,应该触发重组。在代码示例中,一种状态发生变化但不会触发重组,但在代码示例中,两种状态发生变化 onButtonClick 并触发重组。
如何使代码示例一在状态更改时重构?
- 下面的代码不会触发重组
@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")
}
}
- 但是此代码会在单击按钮时触发重组
@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
当状态改变时,应该触发重组。在代码示例中,一种状态发生变化但不会触发重组,但在代码示例中,两种状态发生变化 onButtonClick 并触发重组。
如何使代码示例一在状态更改时重构?
- 下面的代码不会触发重组
@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")
}
}
- 但是此代码会在单击按钮时触发重组
@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