【问题标题】:MutableState in view model?视图模型中的可变状态?
【发布时间】:2021-08-08 15:32:47
【问题描述】:

在我看到的所有将视图模型与 Jetpack Compose 结合使用的示例中,通常将状态存储在视图模型中作为 MutableStateFlow,然后在 compose 函数中应用 collectAsState 以获得 Compose 状态。

我的问题:为什么不直接将状态存储在视图模型中,而不是一些流?例如

class MyViewModel: ViewModel() {
    val showDialog = mutableStateOf(false)
}

@Compose
fun MyScreen(viewModel: MyViewModel) {
    Button(onClick = { viewModel.showDialog = true })
    if (viewModel.showDialog) {
        AlertDialog(...)
    }
}

上面的代码似乎按预期运行。那么这是一个有效的解决方案吗?

【问题讨论】:

  • 你可以随心所欲,这只是最佳实践的问题。检查docs

标签: android-jetpack-compose


【解决方案1】:

是的,确实如此。我不知道您在哪里看到这些示例,但这确实是推荐的做法。您可以查看State Codelab;它演示了如何将LiveData 对象替换为mutableStateOfviewmodel 中。另外,据我所知,就LiveDataFlow的使用而言,主要是为了互操作性。未在 Compose 中完全构建但正在转移的应用程序,或计划与 Compose 一起使用视图系统的应用程序。 mutableStateOf 仅适用于 Jetpack compose,因此,在这种情况下,开发人员将希望使用 LiveData。但是,如果您正在构建一个全新的项目,并且希望它仅由 Compose 组成,那么一定要选择您在问题中提到的内容。这是正确的方法。

【讨论】:

  • 太好了,谢谢!根据您的建议,我设法在 Codelab 中找到了它。但是,在文档中(例如developer.android.com/jetpack/compose/state#viewmodel-state)似乎没有提到这一点。
  • 我认为特定的文档已经过时了。 Codelab 是较新的(事实上,最近也收到了更新),旨在让开发人员通过最佳实践来学习这个概念。
  • 我看到人们在使用 liveData 进行重组时遇到了问题,而使用可变状态的简单交换解决了这个问题。它是专门为撰写而构建的,我认为绝对是推荐的方式。另外,我不知道那个文档,但在我所见过的其他任何地方(在其他文档中),mutableStateOf 是 Compose 的最佳实现。我认为,codelab 也是那些文档的作者。
猜你喜欢
  • 2022-12-03
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多