【问题标题】:Android Compose how to update other Composable function better way?Android Compose 如何更好地更新其他 Composable 功能?
【发布时间】:2021-12-25 13:21:51
【问题描述】:
Screenshot
我只是想点击按钮可以记录 ComposableB()。或者类似这样,例如,如果你点击 ComposableA,ComposableB 将启动动画而不是更新数据。
【问题讨论】:
标签:
android
kotlin
onclick
android-jetpack-compose
【解决方案1】:
虽然通常建议使用 Compose 将事件传递给应用程序逻辑(如 ViewModel)而不是应用程序 UI (Thinking in Compose),但如果您确实需要这样做,您的代码如下所示:
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
@Composable
fun ComposableA() {
var addLogEntry by remember { mutableStateOf(false) }
Column {
Button(onClick = {
addLogEntry = true
}) {
Text(text = "Log")
}
ComposableB(addLogEntry = addLogEntry) {
addLogEntry = false
}
}
}
@Composable
fun ComposableB(
addLogEntry: Boolean,
onLogEntryAdded: () -> Unit
) {
if (addLogEntry) {
Log.d("Shadowmeld", "onAddLogEntry")
onLogEntryAdded()
}
}
在这里,您将一个函数作为第二个参数(onLogEntryAdded,采用 lambda 表达式格式)传递给 ComposableB。这个传递的 lambda 表达式将从 ComposableB 调用以修改 ComposableA 中的状态。
我相信有更好的方法可以做到这一点,例如在 ComposableA 中声明 ComposableB(将状态提升到 ComposableA),或者,如果这不是一个选项,则将 Button onClick 事件传递给 ComposableA 和 ComposableB 都可以观察到的 ViewModel。