如何从外部更新可组合状态?

时间:2020-07-01 14:58:46

标签: android android-jetpack-compose

例如,它在可组合函数中与state {}一起使用。

@Composable
fun CounterButton(text: String) {
    val count = state { 0 }

    Button(
        modifier = Modifier.padding(8.dp),
        onClick = { count.value++ }) {
        Text(text = "$text ${count.value}")
    }
}

但是如何在可组合函数之外更新值? 我发现了一个mutableStateOf()函数和MutableState接口,它们可以在可组合函数之外创建,但在值更新后无效。

我的尝试不起作用的示例:

private val timerState = mutableStateOf("no value", StructurallyEqual)

@Composable
private fun TimerUi() {
    Button(onClick = presenter::onTimerButtonClick) {
        Text(text = "Timer Button")
    }
    Text(text = timerState.value)
}

override fun updateTime(time: String) {
    timerState.value = time
}

撰写版本为0.1.0-dev14

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式来实现此目的:通过可控制的可组合函数的参数公开状态,并在可控制的可组合函数的外部实例化该状态。

代替:

@Composable
fun CounterButton(text: String) {
     val count = remember { mutableStateOf(0) }
     //....
 }

您可以执行以下操作:

@Composable
fun screen() {

    val counter = remember { mutableStateOf(0) }

    Column {
        CounterButton(
            text = "Click count:",
            count = counter.value,
            updateCount = { newCount ->
                counter.value = newCount
            }
        )
    }
}

@Composable
fun CounterButton(text: String, count: Int, updateCount: (Int) -> Unit) {
    Button(onClick = { updateCount(count+1) }) {
        Text(text = "$text ${count}")
    }
}

通过这种方式,您可以通过调用它的函数来控制内部状态。
这称为状态提升