LazyColumn 内部的 LazyColumn

LazyColumn inside LazyColumn

我正在尝试使用 LazyColumn 和下面的代码

创建并列出子列表
DropdownMenu(
    expanded = expandedDomain,
    onDismissRequest = { expandedDomain = false },
) {
    LazyColumn {
        items(1) {
            Checkbox(checked = false /*checkedState.value*/,
                onCheckedChange = {})
            Text(text = "$domainResponse.domains[0].name")
        }
        LazyColumn {
            items(domainResponse.domains[0].pwas) { pwas ->
                Checkbox(checked = false /*checkedState.value*/,
                    onCheckedChange = {})
                Text(text = "$pwas")
            }
        }
    }
}

错误:

@Composable invocations can only happen from the context of a @Composable function

让我尝试部分解释您应该更改的内容。

1。为什么会出现错误?

@Composable invocations can only happen from the context of a @Composable function occurred

如果我们查看 LazyColumn 代码,我们可以找到 content: LazyListScope.() -> Unit 作为内容参数数据类型。

这表明上下文没有可组合的上下文。

相反,像 Column/Row 这样的可组合项将分别具有 content: @Composable ColumnScope.() -> Unit/content: @Composable RowScope.() -> Unit

@Composable 表明 content 具有可组合上下文。

2。如何解决?

根据我在代码中看到的情况,您不需要在另一个 LazyColumn 中使用 LazyColumn。您需要一个 LazyColumn 包含来自不同数据源的多个项目。

您可以像这样更改代码,

LazyColumn {
    item {
        Checkbox(checked = false /*checkedState.value*/,
            onCheckedChange = {})
        Text(text = "$domainResponse.domains[0].name")
    }
    items(domainResponse.domains[0].pwas) { pwas ->
        Checkbox(checked = false /*checkedState.value*/,
            onCheckedChange = {})
        Text(text = "$pwas")
    }
    // You can have multiple lists in a single LazyColumn
    items(list2Items) { item ->
        Text(text = "$item")
    }
}

3。 item 对比 items

如果您只有一个项目,请使用 item 而不是 items(1),因为它们是等价的,但这会更清楚。

P.S:
LazyColumn 使用 itemitems,其中 itemContent 具有可组合上下文。因此我们可以在其中添加可组合项。