【问题标题】:Composable State from Jetpack Compose execute these two states once or twiceJetpack Compose 的可组合状态执行这两个状态一次或两次
【发布时间】:2022-11-26 23:20:52
【问题描述】:

我有两种状态来处理动态弹出屏幕组件

var showPopUpScreen by remember { viewModel.popUpScreenIsOpen }
var popUpType by remember { viewModel.popUpScreenType }

但是当我在打开弹出组件时更改这些 mutableState-values 的值时 像这样:

fun OpenPopUpScreen(type: BasePopUpScreen) {
    popUpScreenType.value = type
    popUpScreenIsOpen.value = true
}

这个可组合函数会被执行两次(性能很重),还是它会足够聪明,知道这些值是立即设置的,所以只执行一次我的弹出渲染函数?

额外代码信息:

fun LiveTrainingScreen(viewModel: LiveTrainingViewModel = viewModel()) {
// lots of code and then:
        var showPopUpScreen by remember { viewModel.popUpScreenIsOpen }
        var popUpType by remember { viewModel.popUpScreenType }

        //pop up container
        if(showPopUpScreen) {

            Row(modifier = Modifier
                .fillMaxSize()
                .background(Color.Black.copy(alpha = 0.6f))
                .zIndex(11f), verticalAlignment = Alignment.CenterVertically) {
                Column(modifier = Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {

                    DyanmicPopUpScreenLiveTraining(popUpScreenTypeInfo = popUpType, viewModel = viewModel)

                } // pop up main column

            } // end pop up screen row

        } // end if pop up screen
}

【问题讨论】:

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


    【解决方案1】:

    我相信重组会在两者都发生变化后立即开始,正如撰写指南所说:

    “重组乐观,可能取消。” [来源:https://developer.android.com/jetpack/compose/mental-model]

    这意味着重组将被取消,因为分配了另一个参数,您将看到 UI 中的状态以两个值的方式发生变化。

    但是,将 UI 状态保存在数据类中并直接记住数据类是更好的方法。这样,您更改两个变量,并且随着数据类的更改组合重置。另外,与其记住数据类,不如在 ViewModel 中提升状态,这样你就可以开始了。

    【讨论】:

    • 是的,我正在考虑这样做,感谢您的反应。会这样做 :D
    【解决方案2】:

    我认为 compose 足够聪明,可以识别变化并对其做出反应。 根据你的问题

    • 一旦您设置了第一个值,它将开始更改构成依赖于它的视图
    • 假设考虑到复杂视图之前的重组过程正在进行,在设置第二个值之后之前的重组将被取消并且 compose 将使用更新的两个值重组您的屏幕。

    所以我们可以有效地重组将只发生一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多