在stackoverflow上,似乎有无数种可能解决此错误的方法,但都未能解决我的问题。
我正在构建一个组合警报对话框。我试图显示一个选项列表,这个列表可以根据数据而改变。
对话框
@Composable
fun OptionSelectComposeDialog(
vm: OptionSelectDialogViewModel
){
...
val optionList = vm.optionList
Column {
if (openDialog.value) {
AlertDialog(
...
text = {
OptionListDialogContent(optionList)
},
...
)
}
}
在
OptionListDialogContent
组合函数中,我试图输出列表,但是 Text
组合函数出现了错误。@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"
}
}
}
}
我怀疑在 optionItem
上进行的 toString
调用会导致此错误,因此我尝试将数组映射为字符串来转换数组值,但仍然收到此错误。
将数组转换为字符串后的 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"
}
}
}
}
有人看到问题出在哪了吗?(我已经验证了
optionItemArray
不是null)
item()
和items()
函数只是向LazyColumn通知项目,并允许它仅在需要时实际组合它们。 - Jan Bína