使用 Lambda 更新可组合函数

Updating a Composable Function with a Lambda

在以下网址的 Android 开发人员文档中:https://developer.android.com/jetpack/compose/mental-model#recomposition

有一个可组合函数,如下所示:

@Composable
fun ClickCounter(clicks: Int, onClick: () -> Unit) {
    Button(onClick = onClick) {
        Text("I've been clicked $clicks times")
    }
}

文中说这会产生一个元素,每次点击它都会更新它被点击的次数。但是,看了一下,似乎需要一个lambda函数才能做到这一点。

当我尝试将其放入 SetContent 函数时,我得到以下信息:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            WorkTimerTheme {
                Conversation(SampleData.conversationSample)
                ClickCounter(clicks = 0) {
                    //Insert My Function Here
                }
            }
        }
    }
}

评论//Insert My Function Here是我加的。我想我必须在其中放置一个 Lambda 来更新可组合项的点击值,但我不知道该放什么。有谁知道可以接受的写法吗?

您需要 MutableState 来触发重组,并且需要 remember{} 来在重组发生时保持之前的值。

我问了 ,我的问题包含对你问题的回答。

@Composable
fun MyScreenContent(names: List<String> = listOf("Android", "there")) {
    val counterState = remember { mutableStateOf(0) }

    Column(modifier = Modifier.fillMaxHeight()) {

        Counter(
            count = counterState.value,
            updateCount = { newCount ->
                counterState.value = newCount
            }
        )
    }
}


@Composable
fun Counter(count: Int, updateCount: (Int) -> Unit) {
    Button(
        onClick = { updateCount(count + 1) },

    ) {
        Text("I've been clicked $count times")
    }
}

非常感谢@Thracian 链接了一个类似的问题。由于我的答案是相关的但略有不同,我想我会 post 我自己的。

正确的代码如下:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {

            val counterState = remember { mutableStateOf(0) }

            WorkTimerTheme {
                Conversation(SampleData.conversationSample)
                ClickCounter(clicks = counterState.value) {
                        counterState.value++
                }
            }
        }
    }
}

按照建议,我添加了一个 mutableState 值,它似乎记住了最后一次 “重组” 中某物的值,除非它被显式更新。如果可变状态 显式更新,这将触发重组(如对@Thracian 问题的回答所述)。

A recomposition 将重绘 Element

为了更新 recomposition 中的值,按钮被点击的次数必须存储在可变状态中,并在每次 [=31= 时传递给可组合函数]重组.

使用可组合函数 Lambda 参数影响可变状态完成循环,更新可变状态,然后用更新后的值重新组合按钮。

这就是 counterState.value++ 的目的。

如上所建议,有关这方面的更多信息,请尝试阅读此文档:https://developer.android.com/jetpack/compose/state#viewmodel-state

该视频与我们在此讨论的内容相关。