我按照上一个Google教程在一个新项目中介绍了Compose/ViewModel/State,但是我遇到了一个我不理解的问题。当我使用Viewmodel中的一个方法将一个对象从null更新为新示例时,UI会被更新,但是当我使用相同的方法只更新这个对象的一个参数时,修改是不可见的。
这里是代码ViewModel
data class AppOscarUiState(
val selectedStep: Step? = null
)
class AppViewModel() : ViewModel(){
private val _uiState = MutableStateFlow(AppUiState())
val uiState: StateFlow<AppUiState> = _uiState.asStateFlow()
fun updateSelectedStep(newStep: step){
_uiState.update { currentState ->
currentState.copy(selectedStep = newStep)
}
// also tried _uiState.value = _uiState.value.copy(selectedStep = newStep)
}
}
在可组合的
fun CardDetail(
appViewModel: AppViewModel
) {
val appUiState by appViewModel.uiState.collectAsState()
Column(
Modifier
.fillMaxSize()
.padding(horizontal = 16.dp, vertical = 8.dp),
) {
Text(
text = appUiState.selectedStep!!.status,
)
OutlinedButton(
onClick = {
selectedStep!!.status = 16
appViewModel.updateSelectedStep(selectedStep)
},
) {
Text(
stringResource(R.string.it_starts),
)
}
}
When the step is selected from a list, ```updateSelectedStep(newStep)``` from the viewmodel is called and a detail container is filled. And when I want to change a parameter, the same is done. A log in ```updateSelectedStep(newStep)``` indicates that the new value is well transmetted, and when the step is deselected and selected again, the new data is visible.
Step is a data class.
So why the modification is not instantaneous ? I have a similar method to update a boolean (not an object) which works fine.
Thanks for your help
1条答案
按热度按时间dl5txlt91#
您将同一个对象传递给
currentState.copy(selectedStep = newStep)
-您可以记录对象地址来查看它-从Compose的Angular 来看,这意味着对象没有更改,因此不需要重新组合。一种选择是将
status
定义为mutableStateOf
,在这种情况下,您不需要使用copy
更新状态:但是如果你想把代码拆分成视图/数据层以获得更好的可测试性/使其更简洁,你不应该把
var
用于你想更新的属性,而应该在所有层上使用copy
: