我试图使用Android docs中的这段代码,但无法理解Layout Composable怎么会有measurablesconstraints的参数.

@Composable
fun MyBasicColumn(
    modifier: Modifier = Modifier,
    content: @Composable () -> Unit
) {
    Layout(
        modifier = modifier,
        content = content
    ) { this: MeasureScope measurables, constraints -> 

        // ...
    }
}

我发现它与下面的扩展功能有关,但我仍然不知道它是如何工作的.

local final fun MeasureScope.`<anonymous>`(
    measurables: List<Measurable>,
    constraints: Constraints
): MeasureResult

另外,我还想知道<anonymous>函数名是什么,因为我试图创建一个同名的扩展函数,但得到了这个编译错误:

name contains illegal characters: <>

Identifier not allowed in Android projects

推荐答案

听起来您好像在问参数是如何传递的(而不是布局是如何工作的).如果是这样的话.

正常情况下,类似于此的函数可能如下所示

@Composable inline fun Layout(
    ...
    someFunction: (List<Measurable>, Constraints) -> MeasureResult
) {
    ...
}

我有种感觉那就是你期待看到的.您可能已经听说过,这被称为高阶函数,它是一个将其他函数作为参数或返回函数的函数.

这里令人困惑的部分是,Layout的实际定义如下:

@Composable inline fun Layout(
    ...
    measurePolicy: MeasurePolicy
) {
    ...
}

MeasurePolicy是一个具有多个默认函数和单个抽象函数的接口:

fun MeasureScope.measure(
    measurables: List<Measurable>,
    constraints: Constraints
): MeasureResult

这种类型的接口被称为SAM(单抽象方法)接口,并且可以以与普通Kotlin函数类型相同的容量使用.将其作为最后一个参数允许您在结束Paren之后定义该lambda.

这样做的好处是当您定义您的lambda时:

Layout(
    modifier = modifier,
    content = content
) { measurables, constraints -> 
    ... your lambda content ...
}

您正在定义该接口的一个实现,并且在该接口定义的lambda中有两个额外的函数可用.

至于<anonymous>部分,我怀疑您在某个地方看到了反编译的源代码--<anonymous>将把lambda表示为接口的一个实现.你可以想象一下这个lambda变成了那个匿名的object

Layout(
    modifier = modifier,
    content = content,
    measurePolicy = object: MeasurePolicy {
        fun MeasureScope.measure(
            measurables: List<Measurable>,
            constraints: Constraints
        ): MeasureResult {
            // ... your lambda content ...
        }
    }

Android相关问答推荐

使用mvvm和jetpack的Android中的视图模型compose

Kotlin Gzip字符串未按预期工作

如何在Jetpack导航中不显示目的地?

泛型类型lambda函数参数作为函数参数

关闭导致Kotlin中的内存泄漏?

Android Studio中的Kotlin版本不兼容错误:需要元数据1.9.0,但找到1.6.0

如何阻止Gradle在编译时生成app-metadata.properties

FireBase Android ChildEventListener在被规则拒绝时触发(RTDB)

插入视图模型时,dagger 未命中绑定错误

Color.Transparent 和 Color.Unspecified 之间的区别

FFmpeg Android 错误

Android 构建失败:找不到 flexbox2.0.1.aar

Jetpack Compose Canvas drawText colored颜色 混合?

组成不重叠的元素

如何从日期 Select 器计算年龄?

如何在 Android 上移动 EditText 上的图标?

Android Studio Emulator Internet 连接问题仅是第一次

在 Room 中创建一对多关系时,@Relation 类是什么意思?

不能在kotlin的lazycolumn中使用列表

Android Compose webview 被拉伸