首页 > 解决方案 > 在后台线程中测量子可组合项

问题描述

我想创建一个@Composable布局,以特定方式放置其子可组合。为此,它需要知道Constraints,例如maxWidthmaxHeight。但是在数据集庞大的情况下,孩子们的大小和位置的计算可能会很繁重。有没有办法在后台线程中执行此计算,然后“发布”MeasureResult后面?代码如下所示:

Layout(
    content = {
        data.forEach { node ->
            ItemContent(node)
        }
    },
) { measurables, constraints ->
    val nodes = measurer.measureNodes( // I want to do this in background
        data,
        constraints.maxWidth,
        constraints.maxHeight,
    )
    val placeables = measurables.mapIndexed { index, measurable ->
        measurable.measure(Constraints.fixed(nodes[index].width, nodes[index].height))
    }
    layout(constraints.maxWidth, constraints.maxHeight) {
        placeables.forEachIndexed { index, placeable ->
            placeable.placeRelative(nodes[index].offsetX, nodes[index].offsetY)
        }
    }
}

问题是,您不能在 measure 块内启动协程,也不能将整个Layout可组合组件包装在协程范围内,因为它需要从可组合范围调用。我不知道该怎么做

标签: androidkotlinandroid-jetpack-compose

解决方案


我不知道你在想什么,但你真的应该参考文档。Compose 中的所有 UI 呈现都是异步的,因此您不必担心在这里显式创建协程或产生新线程。


推荐阅读