Jetpack Compose - 我们如何在 onClick() 中调用 @Composable 函数

DSP*_*DSP 6 android-jetpack-compose

我知道在 onClick 中调用可组合函数是不可能的。@Composable 调用只能在 @Composable 函数的上下文中发生

撰写版本 - alpha06

但我坚持以下要求。要求是,在 onClick 内调用服务器 api 调用。

LazyColumnFor(items = list) { reports ->
    Box(Modifier.clickable(
        onClick = {
            //API call
            val liveDataReportsDetails =
                viewModel.getReportDetails("xxxx")
            LiveDataComponentForReportsDetails(liveDataReportsDetails)


        }
    )) {

        ReportListItem(
            item = reports
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

job*_*ert 9

所以你是对的,不能从按钮或修饰符的 onClicks 中调用可组合函数。因此,您需要创建一个值,例如:

private val showDialog = mutableStateOf(false)
Run Code Online (Sandbox Code Playgroud)

当设置为 true 时,您要调用可组合代码,例如:

if(showDialog.value) {
    alert()
}
Run Code Online (Sandbox Code Playgroud)

警报是这样的:

@Composable
fun alert() {
    AlertDialog(
        title = {
            Text(text = "Test")
        },
        text = {
            Text("Test")
        },
        onDismissRequest = {

        },
        buttons = {
            Button(onClick = { showDialog.value = false }) {
                Text("test")
            }
        }

    )
}
Run Code Online (Sandbox Code Playgroud)

现在完成更改预期的布尔值,例如:

Box(Modifier.clickable(
    onClick = {
        showDialog.value = true
    }
))
Run Code Online (Sandbox Code Playgroud)

我希望这个解释有帮助,当然值不一定是布尔值,但你明白了这个概念:)。

  • 谢谢@jobbert (2认同)
  • @jobbert,为了让它在值发生变化时触发,你把 if(showDialog.value) {alert() } 放在哪里? (2认同)
  • 像这样的处理,Compose 看起来代码很复杂。 (2认同)