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

ill*_*zor 9 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}")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如何在可组合函数之外更新值呢?我发现了一个 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
}
Run Code Online (Sandbox Code Playgroud)

Compose版本是0.1.0-dev14

Gab*_*tti 2

您可以通过受控可组合函数的参数公开状态并从控制可组合函数外部实例化它来实现此目的。

代替:

@Composable
fun CounterButton(text: String) {
     val count = remember { mutableStateOf(0) }
     //....
 }
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

@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}")
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你的回答,但这不是我问的问题。我需要更新不可组合函数的值 (12认同)