我发现当有大量数据时,ExposedDropdownMenuBox会出现性能问题。
所以我做了一些搜索,找到了这个issue,它说LazyColumn
可以用来提高性能。
但我得到以下错误:
java.lang.IllegalStateException:不支持请求SubcomposeLayout布局的内部度量。这包括构建在SubcomposeLayout之上的组件,如惰性列表、BoxWithConstraints、TabRow等。要缓解此问题,请执行以下操作:
如果使用内部测量来实现“匹配父级”大小调整,请考虑用自定义布局替换组件的父级,该自定义布局控制测量子级的顺序,使内部测量不需要向组件添加大小修改器,以便快速返回查询的内部测量。
下面是完整的代码:
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SageExposedDropdownMenuBox(options: List<DropDownMenuOption>) {
var expanded by remember { mutableStateOf(false) }
var selected by remember { mutableStateOf<DropDownMenuOption?>(null) }
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = {
expanded = !expanded
}
) {
TextField(
value = selected?.label ?: "",
onValueChange = {
},
readOnly = true,
modifier = Modifier.menuAnchor()
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
LazyColumn {
items(options) { option ->
DropdownMenuItem(
text = { Text(text = option.label) },
onClick = {
selected = option
expanded = false
}
)
}
}
}
}
}
字符串
我刚开始学习jetpack compose,不知道intrinsic measurements
和ExposedDropdownMenuBox
的内部结构。
请告诉我如何修复这个错误。
1条答案
按热度按时间thtygnil1#
在这一点得到正确支持之前,请考虑以下解决方案:根据单个项目的高度和弹出窗口可以采用的最大高度对惰性列的高度进行硬编码。同样,根据您的用例调整宽度。
字符串