首页 > 解决方案 > 使用 mutableStateOf 而不是 observeAsState

问题描述

我在一个 Android 应用程序中使用 Jetpack Compose 并且遇到了我的 uiState (LiveData) 在每次重组时都设置为其初始值的问题,因为我已经像初始化它一样

val authUiState: AuthUIState by authenticationViewModel.uiState.observeAsState(AuthUIState.Loading)

在设置为正确值之前,它在每次重组时都设置为 Loading。当我尝试记住该值时,我了解到我们不能在记住块中使用observeAsState,最后将其更改为

val authUiState = remember{ mutableStateOf(authenticationViewModel.uiState.value) }.value

这行得通,但我不太确定,如果这是解决这个问题的常用和好方法。你怎么看?我应该采取不同的做法吗?你需要更多信息?

标签: androidandroid-jetpack-compose

解决方案


查看uiState您的视图模型内部是否类似于 LiveData 对象(从代码中看起来有点像),推荐的方法是将其作为可变状态存储在视图模型本身中。

var uiState by mutableStateOf (initialValue)
private set //Do not allow external modifications to maintain consistency of state

fun onUiStateChange(newValue: Any){
uiState = newValue
}

您只需要将其初始化为 MutableState,在其余代码中,以更新、删除或任何您想对它执行的操作,只需将其视为常规变量即可。每次更新值时,Compose 都会触发重新组合。

下面的代码片段几乎肯定不会工作,因为在这里,状态是你在 mutableStateOf() 中包装的任何内容,它只是一个简单的值,将从视图模型中获取一次,然后在整个重组过程中被记住,因此不会更改代码在这里触发

val authUiState by remember{ mutableStateOf(authenticationViewModel.uiState.value) }

据我所知,将视图模型中的状态存储为 mutableState 是 compose 的最佳实践。您将在 Android 开发人员的“State Codelab”中看到相同的内容

祝你好运


推荐阅读