我有一个组件,需要迭代并呈现一个Map<String, List<String>>
.它们的键是"标题"和列表子项.
我想写我的代码如下:
@Composable
fun renderFullMap(groupedItems: Map<String, List<String>>) {
LazyColumn {
groupedItems.forEach { (header, things) ->
renderSection(header, things)
}
}
}
@Composable
fun renderSection(header: String, things: List<String>) {
stickyHeader { Text(header) }
items(things) { thing -> Text(thing) }
}
(在实践中,实际数据和renderSection
都比较复杂,但它们可以归结为这个基本概念.)
这不管用.它告诉我:
@可组合调用只能在@Composable函数的上下文中进行
如果我使用items
在 map 键上迭代,我会得到一个不同的错误:
@Composable
fun renderFullMap(groupedItems: Map<String, List<String>>) {
LazyColumn {
items(groupedItems.keys.toList()) { header ->
renderSection(header, groupedItems[header])
}
}
}
在这个版本中,stickyHeader
和items
在renderSection
中是未定义的.
我试过的最后一件事是用LazyListScope.
作为renderSection
的前缀:
@Composable
fun LazyListScope.renderSection(header: String, things: List<String>) {
stickyHeader { Text(header) }
items(things) { thing -> Text(thing) }
}
这只是暗中捅了一刀.如果我在forEach
中调用它,它会告诉我,它给出了关于只能从其他可编程组件调用的可编程组件的第一个错误.如果我从items()
以内称之为:
"有趣的懒汉.".renderSection(header:String,things:List):在此上下文中,隐式接收方无法调用Unit.如有必要,使用显式
我不会假装知道那是什么意思.
我该怎么做?我怀疑我不知何故需要将LazyListScope扩展到renderSection
个,但不清楚如何扩展.
编辑:我有点让它工作了,但我的列表项在滚动时成倍增加.此代码编译:
@Composable
fun renderFullMap(groupedItems: Map<String, List<String>>) {
LazyColumn {
val scope = this
items(groupedItems.keys.toList()) { header ->
scope.renderSection(header, groupedItems[header])
}
}
}
@Composable
fun LazyListScope.renderSection(header: String, things: List<String>) {
stickyHeader { Text(header) }
items(things) { thing -> Text(thing) }
}
然而,我不知道为什么 list 的内容不正常.