【发布时间】:2021-10-21 13:48:29
【问题描述】:
在official documents 中可以看到有一个名为 SubcomposeLayout 的布局定义为
布局的模拟,允许子组合实际内容 在测量阶段,例如使用计算的值 在测量过程中作为孩子组成的参数。
可能的用例:
你需要知道父进程在 组合并且不能仅使用自定义布局来解决您的用例或 布局修改器。看 androidx.compose.foundation.layout.BoxWithConstraints。
您想在构图过程中使用一个孩子的大小 第二个孩子。
您想根据可用尺寸懒惰地组合您的项目。为了 例如,您有一个包含 100 个项目的列表,而不是组成所有 他们你只组成当前可见的那些(比如 5 个 它们)并在组件滚动时组成下一个项目。
我用SubcomposeLayout关键字搜索了Stackoverflow,但找不到任何相关信息,创建了这个示例代码,从官方文档中复制了大部分内容,以测试和了解它是如何工作的
@Composable
private fun SampleContent() {
Column(
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
) {
SubComponent(
mainContent = {
Text(
"MainContent",
modifier = Modifier
.background(Color(0xffF44336))
.height(60.dp),
color = Color.White
)
},
dependentContent = {
val size = it
println("???? Dependent size: $size")
Column() {
Text(
"Dependent Content",
modifier = Modifier
.background(Color(0xff9C27B0)),
color = Color.White
)
}
}
)
}
}
@Composable
private fun SubComponent(
mainContent: @Composable () -> Unit,
dependentContent: @Composable (IntSize) -> Unit
) {
SubcomposeLayout { constraints ->
val mainPlaceables = subcompose(SlotsEnum.Main, mainContent).map {
it.measure(constraints)
}
val maxSize = mainPlaceables.fold(IntSize.Zero) { currentMax, placeable ->
IntSize(
width = maxOf(currentMax.width, placeable.width),
height = maxOf(currentMax.height, placeable.height)
)
}
layout(maxSize.width, maxSize.height) {
mainPlaceables.forEach { it.placeRelative(0, 0) }
subcompose(SlotsEnum.Dependent) {
dependentContent(maxSize)
}.forEach {
it.measure(constraints).placeRelative(0, 0)
}
}
}
}
enum class SlotsEnum { Main, Dependent }
它应该根据另一个组件的大小重新测量一个组件,但这段代码的实际作用对我来说是个谜。
-
subcompose函数是如何工作的? -
slotId的意义何在?我们能否以某种方式获取 slotId?
subCompose函数说明
使用给定的 slotId 执行提供的内容的子组合。 参数: slotId - 代表我们正在组成的插槽的唯一 ID 进入。如果您有固定数量或插槽,您可以使用枚举作为插槽 id, 或者如果您有一个项目列表,可能是列表中的索引或一些 其他唯一键可以工作。为了能够正确匹配内容 在重新测量之间,您应该提供等于的对象 您在上一次测量中使用的那个。内容—— 定义插槽的可组合内容。它可以发出多个 布局,在这种情况下,返回的 Measurables 列表将具有 多个元素。
有人可以解释它的含义或/并为SubcomposeLayout 提供工作示例吗?
【问题讨论】:
标签: android android-jetpack-compose