【问题标题】:Other state management options that I may use with Jetpack Compose, beyond State hoisting?除了状态提升之外,我可以与 Jetpack Compose 一起使用的其他状态管理选项?
【发布时间】:2022-02-06 21:46:58
【问题描述】:

我正在学习 Jetpack compose,到目前为止,我已经看到将状态提升到可组合的调用者以使可组合的无状态是要走的路。我一直在我的 Compose 应用中使用这种模式。

对于我需要从树的许多不同位置修改的应用程序状态,我将不得不传递大量回调,这可能变得难以管理。

我之前对 Flutter 有过一些经验。 Flutter 在树中为其后代提供状态以克服上述问题的方式是使用其他机制来管理状态,即 Provider + ChangeNotifier。

基本上,使用 Provider,Provider Widget 被放置在树中,并且 Provider 的所有子级都可以访问它所公开的值。

除了状态提升之外,还有其他机制来管理 Jetpack Compose 应用中的状态吗?还有,你会推荐什么?

【问题讨论】:

标签: android kotlin android-jetpack-compose android-jetpack


【解决方案1】:

如果您需要在视图之间共享一些数据,您可以使用view models。

@Composable
fun TestScreen() {
    val viewModel = viewModel<SomeViewModel>()
    Column {
        Text("TestScreen text: ${viewModel.state}")
        OtherView()
    }
}

@Composable
fun OtherView() {
    val viewModel = viewModel<SomeViewModel>()
    Text("OtherScreen text: ${viewModel.state}")
}

class SomeViewModel: ViewModel() {
    var state by mutableStateOf(UUID.randomUUID().toString())
}

最顶层的viewModel 调用创建了一个视图模型——在我的例子中是TestScreen。所有调用同一类的viewModel 的孩子都将获得相同的对象。例外情况是 Compose Navigation 的不同目的地,请参阅 this answer 中如何处理这种情况。

您可以更新视图模型的可变状态属性,它将反映在使用该模型的所有视图上。查看更多关于state in Compose的信息。

视图模型生命周期绑定到撰写导航路线(如果有)或Activity / Fragment 否则,取决于从哪里调用setContent。

【讨论】:

  • 采用您示例的 TestScreen 可组合项,只要将 Column 重构为可组合项,您就必须将 viewModel 对象或其属性/方法作为参数传递。因此,随着可组合树的增加,我将不得不传递 viewModel 的许多回调和属性。
  • @lbarqueira 如你所见,我没有将它传递给OtherView,但viewModel() 将返回相同的对象,因为OtherView 是TestScreen 的子对象
  • 我能不能断定Google的Composable State codelab在将viewmodel作为可组合函数参数传递时是为了满足单向数据流模式,即状态向下流动,事件向上流动?跨度>
  • @lbarqueira 你能给我你正在谈论的代码的链接吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多