理解包含点后跟方括号的lambda构造

这是 rememberCoilPainter 的函数声明:

@Composable
fun rememberCoilPainter(
    request: Any?,
    imageLoader: ImageLoader = CoilPainterDefaults.defaultImageLoader(),
    shouldRefetchOnSizeChange: ShouldRefetchOnSizeChange = ShouldRefetchOnSizeChange { _, _ -> false },
    requestBuilder: (ImageRequest.Builder.(size: IntSize) -> ImageRequest.Builder)? = null,
    fadeIn: Boolean = false,
    fadeInDurationMs: Int = LoadPainterDefaults.FadeInTransitionDuration,
    @DrawableRes previewPlaceholder: Int = 0,
): LoadPainter<Any> {

}

我难以理解的代码行是:

requestBuilder: (ImageRequest.Builder.(size: IntSize) -> ImageRequest.Builder)? = null

Builder 后面会出现一个点,然后是 (size: IntSize)

这是我第一次在 Kotlin 中看到这个结构,我不确定如何解释它。这是一个拉姆达。通常,对象后面的点指的是类或包的子组件。但是点后面的 ( ) 不清楚。

如何实现 requestBuilder 参数?

回答

这是一个具有接收器类型的函数,如下所述:https : //kotlinlang.org/docs/lambdas.html#function-types

函数类型可以选择有一个额外的接收器类型,它在符号中的点之前指定:类型 A.(B) -> C 表示可以在 A 的接收器对象上调用的函数,参数为 B 并返回一个C 的值。带有接收器的函数文字通常与这些类型一起使用。

一开始可能很难理解,但这就像您提供的函数/lambda 是ImageRequest.Builder. 或者换句话说:你的 lambda 接收一个额外的类型参数,ImageRequest.Builder它在 lambda 中可用this

您可以requestBuilder像任何其他 lambda 一样提供,但请注意,在其中您将可以访问ImageRequest.Builder提供给您的对象的属性和方法。


以上是理解包含点后跟方括号的lambda构造的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>