使用 mutableStateOf 而不是 observeAsState

时间:2021-06-23 15:44:43

标签: android android-jetpack-compose

我正在 Android 应用程序中使用 Jetpack Compose,但遇到的问题是我的 uiState (LiveData) 在每次重新组合时都设置为其初始值,因为我已将其初始化为

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

在设置为正确值之前,它在每次重新组合时都设置为正在加载。 当我尝试Remember这个值时,我了解到我们不能在remember块中使用observeAsState,最后把它改成了

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

这行得通,但我不太确定,这是否是解决此问题的常见且好方法。 你怎么认为?我应该以不同的方式做吗?您需要更多信息吗?

1 个答案:

答案 0 :(得分:0)

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

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”中看到相同的内容

祝你好运