理解包含点后跟方括号的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提供给您的对象的属性和方法。