首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jetpack编写AlertDialog错误:"@Composable调用只能在@Composable函数的上下文中发生“

Jetpack编写AlertDialog错误:"@Composable调用只能在@Composable函数的上下文中发生“
EN

Stack Overflow用户
提问于 2022-03-04 16:35:16
回答 2查看 3.9K关注 0票数 3

对于堆栈溢出上的错误,似乎有无数的解释,但没有一个能解决我的问题。

我正在构建一个构图警告对话框。我正在尝试显示一个选项列表,这些选项可以根据数据进行更改。

对话框

代码语言:javascript
运行
复制
@Composable
fun OptionSelectComposeDialog(
   vm: OptionSelectDialogViewModel
){
...
val optionList = vm.optionList
Column {
    if (openDialog.value) {
        AlertDialog(
            ...
            text = {
                OptionListDialogContent(optionList)
            },
            ...
        )
    }
}

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

OptionListDialogContent

代码语言:javascript
运行
复制
@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"
            }
        }
    }
}

我怀疑toString调用在optionItem上抛出了这个错误,所以我尝试映射数组来将数组值转换为字符串,但仍然收到了这个错误。

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

代码语言:javascript
运行
复制
@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不是空的)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-04 19:29:08

事实证明,这是我如何使用LazyColumn的一个问题。LazyColumn需要接收数组大小。做这件事有很多不同的方法,但我就是这样做的:

代码语言:javascript
运行
复制
LazyColumn() {
    if (optionItemStringArray != null) {
        items(optionItemStringArray.size) { i ->
            Row() {
                Text(text = optionItemStringArray[i])
            }
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2022-03-04 16:51:58

您正在尝试在文本字段中放置一个惰性列表(在OptionListDialogContent中)。

代码语言:javascript
运行
复制
text = {
                OptionListDialogContent(optionList)
       },

参数需要兼容才能得到一个可组合的函数。在这种情况下,文本没有这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71354410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档