Jetpack Compose AlertDialog 错误:“@Composable 调用只能在 @Composable 函数的上下文中发生”

pet*_*art 5 android text dialog kotlin android-jetpack-compose

stackoverflow 上似乎有无数对此错误的解释,但没有一个能解决我的问题。

我正在构建一个撰写警报对话框。我试图显示一个可以根据数据而变化的选项列表。

对话

@Composable
fun OptionSelectComposeDialog(
   vm: OptionSelectDialogViewModel
){
...
val optionList = vm.optionList
Column {
    if (openDialog.value) {
        AlertDialog(
            ...
            text = {
                OptionListDialogContent(optionList)
            },
            ...
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

OptionListDialogContent可组合函数中,我尝试打印列表,但Text可组合函数给出错误。

OptionListDialogContent

@Composable
fun OptionListDialogContent(optionList: OptionList?) {

    val optionItemArray = optionList?.getOptionItemArray(null)

    LazyColumn() {
        if (optionItemArray != null) {
            optionItemArray.forEach { optionItem ->
                Text(text = optionItem.toString()) // Error "@Composable invocations can only happen from the context of a @Composable function"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑对toString的调用optionItem引发了此错误,因此我尝试映射数组以将数组值转换为字符串,但仍然收到此错误。

OptionListDialogContent将数组转换为字符串后:

@Composable
fun OptionListDialogContent(optionList: OptionList?) {

    val optionItemArray = optionList?.getOptionItemArray(null)
    val optionItemStringArray = optionItemArray?.map { it.toString()}?.toTypedArray()

    LazyColumn() {
        if (optionItemStringArray != null) {
            optionItemStringArray.forEach { optionItem ->
                Timber.d("This is working? - optionItemArray.size: %s", optionItemArray.size)
                Text(text = optionItem) // Error "@Composable invocations can only happen from the context of a @Composable function"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有人看出问题出在哪里吗?(我已经验证optionItemArray不为空)

pet*_*art 4

事实证明,这是我使用 LazyColumn 的方式的问题。LazyColumn 需要接收数组大小。有不同的方法可以做到这一点,但这就是我的做法:

LazyColumn() {
    if (optionItemStringArray != null) {
        items(optionItemStringArray.size) { i ->
            Row() {
                Text(text = optionItemStringArray[i])
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)