Jetpack Compose AlertDialog Error: "@Composable invocations can only happen from the context of a @Composable function"
Jetpack Compose AlertDialog Error: "@Composable invocations can only happen from the context of a @Composable function"
关于 Whosebug 上的这个错误似乎有无数种解释,none 其中解决了我的问题。
我正在构建一个撰写警报对话框。我正在尝试显示可根据数据更改的选项列表。
对话框
@Composable
fun OptionSelectComposeDialog(
vm: OptionSelectDialogViewModel
){
...
val optionList = vm.optionList
Column {
if (openDialog.value) {
AlertDialog(
...
text = {
OptionListDialogContent(optionList)
},
...
)
}
}
在 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"
}
}
}
}
我怀疑 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
不为空)
您正在尝试将惰性列表(位于 OptionListDialogContent 中)放入文本字段
text = {
OptionListDialogContent(optionList)
},
参数需要兼容才能采用可组合的功能。在这种情况下,文本不会那样做。
原来这是我使用 LazyColumn 的方式的问题。 LazyColumn 需要接收数组大小。有多种方法可以做到这一点,但我是这样做的:
LazyColumn() {
if (optionItemStringArray != null) {
items(optionItemStringArray.size) { i ->
Row() {
Text(text = optionItemStringArray[i])
}
}
}
}
关于 Whosebug 上的这个错误似乎有无数种解释,none 其中解决了我的问题。
我正在构建一个撰写警报对话框。我正在尝试显示可根据数据更改的选项列表。
对话框
@Composable
fun OptionSelectComposeDialog(
vm: OptionSelectDialogViewModel
){
...
val optionList = vm.optionList
Column {
if (openDialog.value) {
AlertDialog(
...
text = {
OptionListDialogContent(optionList)
},
...
)
}
}
在 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"
}
}
}
}
我怀疑 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
不为空)
您正在尝试将惰性列表(位于 OptionListDialogContent 中)放入文本字段
text = {
OptionListDialogContent(optionList)
},
参数需要兼容才能采用可组合的功能。在这种情况下,文本不会那样做。
原来这是我使用 LazyColumn 的方式的问题。 LazyColumn 需要接收数组大小。有多种方法可以做到这一点,但我是这样做的:
LazyColumn() {
if (optionItemStringArray != null) {
items(optionItemStringArray.size) { i ->
Row() {
Text(text = optionItemStringArray[i])
}
}
}
}