【问题标题】:Using mutableStateOf instead of observeAsState使用 mutableStateOf 而不是 observeAsState
【发布时间】:2021-06-25 03:59:28
【问题描述】:

我正在一个 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

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

【问题讨论】:

  • 你可以初始化uiState而不使用我猜的默认值:-val authUiState: AuthUIState by authenticationViewModel.uiState.observeAsState()
  • @jpm,你刚刚删除协程问题的原因是什么?我认为这是一个很好的问题,对其他人会有所帮助,我花时间明确地回答了它。
  • @Tenfour04,对不起。你的回答并没有真正解决我的问题,我注意到这个问题并不是很清楚,即使对我来说也是如此。所以我会使用我目前的解决方案,直到我更清楚我真正需要什么,或者可以自己解决,或者回到这里。

标签: android android-jetpack-compose


【解决方案1】:

查看视图模型中的 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 都会触发重新组合。

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

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

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

祝你好运

【讨论】:

  • 谢谢,这行得通。而且看起来好多了:)
  • 很高兴为您提供帮助:)
猜你喜欢
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2021-05-24
相关资源
最近更新 更多