使用 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
该视频与我们在此讨论的内容相关。
在以下网址的 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
该视频与我们在此讨论的内容相关。