在Kotlin中如何将List值传入vararg参数?
问题:Pair列表传入vararg参数报错解决
原本的正常写法
直接传入Pair参数时,代码可以正常运行:
val verticalBrush2 = Brush.verticalGradient( 0.25f to Color.Blue, 1f to Color.Red, )
业务调整后的写法
因为需要动态设置颜色,把颜色对改成List存储:
val brushColors = listOf(0.25f to Color.Blue, 1f to Color.Red)
尝试转换后的报错
用toTypedArray()转换后传入Brush.verticalGradient,编译报错:类型不匹配:推断类型是Array<Pair<Float, Color>>,但需要的是List
问题原因
Brush.verticalGradient的vararg参数接受的是ColorStop类型,虽然Pair<Float, Color>能隐式转成ColorStop,但数组转换后不会自动触发这个隐式转换,导致类型不匹配。
解决方法
方案1:显式转换后用*展开数组
把List里的每个Pair转成ColorStop,再转成数组并用*展开传入vararg:
drawLine( brush = Brush.verticalGradient( *brushColors.map { it.toColorStop() }.toTypedArray() ), start = Offset(x = 0F, y = 0F), end = Offset(x = 0F, y = size.height), strokeWidth = 3.dp.toPx(), )
方案2:直接用List重载(如果有)
如果Brush.verticalGradient提供了接受List<ColorStop>的重载,直接传转换后的List更简单:
drawLine( brush = Brush.verticalGradient(colors = brushColors.map { it.toColorStop() }), start = Offset(x = 0F, y = 0F), end = Offset(x = 0F, y = size.height), strokeWidth = 3.dp.toPx(), )
关键提示
toColorStop()是Compose提供的扩展函数,专门用来把Pair<Float, Color>转成ColorStop*操作符是Kotlin里把数组“拆成”vararg参数的必须操作,没有它的话数组会被当成单个参数传入,导致类型错误
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

