【问题标题】:Updating a Composable Function with a Lambda使用 Lambda 更新可组合函数
【发布时间】:2021-09-15 16:35:59
【问题描述】:

在以下网址的 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,但我不知道该放什么。有谁知道可以接受的写作方式吗?

【问题讨论】:

  • 这是一个关于撰写中状态的非常基本的问题,我建议您查看documentation
  • 感谢您的信息!就我个人而言,我发现谷歌文​​档非常不守规矩,因为有人迟到了。对具体问题的回答往往会给我更多的信息,即使它们很简单,我认为它们可以帮助像我这样的新人,因此值得回答!
  • 这些文档是专门为初学者制作的!甚至还有一个包含基本原理的视频,可能对您来说更方便。
  • 这可能是我在公平方面的心理障碍!但是在我看来,更多关于如何做同样事情的信息只会对学习有好处,你可以认为它是一个“有效的例子”。我现在正在看视频,它实际上非常好,我稍后会更新我的答案以考虑到这一点!

标签: android kotlin lambda android-jetpack-compose android-jetpack


【解决方案1】:

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

我向question 询问了此事,我的问题包含对您问题的答案。

@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")
    }
}

【讨论】:

    【解决方案2】:

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

    正确的代码如下:

    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 值,该值似乎可以记住上一次 “recomposition” 中某些内容的值,除非它被明确更新。如果可变状态显式更新,这将触发重组(如@Thracian 问题的答案中所述)。

    重新组合将重绘元素

    为了更新 recomposition 处的值,按钮被点击的次数必须存储在可变状态中,并在每次 recomposition 时传递给 Composable Function。

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

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

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

    该视频与我们在这里讨论的内容有关。

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2021-10-18
      • 1970-01-01
      • 2018-10-02
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多