android 如何在ExposedDropdownMenu中使用LazyColumn?

b4lqfgs4  于 12个月前  发布在  Android
关注(0)|答案(1)|浏览(141)

我发现当有大量数据时,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 measurementsExposedDropdownMenuBox的内部结构。
请告诉我如何修复这个错误。

thtygnil

thtygnil1#

在这一点得到正确支持之前,请考虑以下解决方案:根据单个项目的高度和弹出窗口可以采用的最大高度对惰性列的高度进行硬编码。同样,根据您的用例调整宽度。

val sizeOfOneItem by remember {
        mutableStateOf(50.dp) //assuming height of one menu item 50dp
    }
    val configuration = LocalConfiguration.current
    val screenHeight50 by remember {
        val screenHeight = configuration.screenHeightDp.dp
        mutableStateOf(screenHeight / 2) //assuming the drop down menu anchor is in middle of the screen. This is the maximum height that popup menu can take.
    }
    val height by remember(options.size) {
        val itemsSize = sizeOfOneItem * options.size
        mutableStateOf(minOf(itemsSize, screenHeight50))
    }
    ExposedDropdownMenu(
        expanded = expanded,
        onDismissRequest = {
            expanded = false
        }
    ) {
        LazyColumn(
            modifier = Modifier
                .width(500.dp)
                .height(height)
        ) {
            items(options) { option ->
                DropdownMenuItem(
                    onClick = {},
                    text = {
                        Text(text = option.label)
                    }
                )
            }
        }

字符串

相关问题