【问题标题】:Jetpack Compose - How can we call a @Composable function inside an onClick()Jetpack Compose - 我们如何在 onClick() 中调用 @Composable 函数
【发布时间】:2021-01-09 10:35:26
【问题描述】:

我知道在 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
        )
    }
}

【问题讨论】:

    标签: android-jetpack-compose


    【解决方案1】:

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

    private val showDialog = mutableStateOf(false)
    

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

    if(showDialog.value) {
        alert()
    }
    

    警报类似于:

    @Composable
    fun alert() {
        AlertDialog(
            title = {
                Text(text = "Test")
            },
            text = {
                Text("Test")
            },
            onDismissRequest = {
    
            },
            buttons = {
                Button(onClick = { showDialog.value = false }) {
                    Text("test")
                }
            }
    
        )
    }
    

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

    Box(Modifier.clickable(
        onClick = {
            showDialog.value = true
        }
    ))
    

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

    【讨论】:

    • 谢谢@jobbert
    • @jobbert,让它在值发生变化时触发,你把 if(showDialog.value) { alert() } 放在哪里?
    • 顺便说一句,这是最佳实践吗?
    • @RohitJakhar 对此没有通用规则,因此真的无法笼统地回答这个问题。如果您的代码是干净的,这是最佳实践。根据您的架构,这可以适合或不适合。
    • 当我点击列表项时如何在对话框中传递值?
    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    相关资源
    最近更新 更多