【问题标题】:Passing Modifier.align as a parameter传递 Modifier.align 作为参数
【发布时间】:2021-12-02 05:58:03
【问题描述】:

我有一个 Composable 如下:

@Composable
private fun MoviePosterWithRating(movie: MovieModel) {
Box {
    Image(<...>)
    Box( //Rating circle
        contentAlignment = Alignment.Center,
        modifier = Modifier
            .padding(end = 8.dp, top = 220.dp)
            .size(48.dp)
            .background(Color.Black, shape = CircleShape)
            .align(Alignment.TopEnd)
    ) {
        CircularProgressIndicator(
            progress = movie.score / 10,
            color = percentageCircleColor(movie.score),
            strokeWidth = 2.dp
        )
        Text(
            text = "${movie.score.asPercentage()}%",
            color = Color.White,
            textAlign = TextAlign.Center,
            fontSize = 13.sp,
            modifier = Modifier.padding(4.dp)
        )
    }
}

我想将评级圈提取到它自己的方法中,以便我可以重复使用它。但是,我不能因为 align on 修饰符。我可以将整个修饰符作为参数传递,但我每次只传递相同的填充、大小和背景颜色。有没有办法让我只传入修饰符的 .align 部分?

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    您应该这样做的方式是让您的可组合接受 Modifier 作为参数,这样您就可以在调用点传递它,从而使您的可组合更加灵活:

    @Composable
    fun RatingCircle(
        modifier: Modifier = Modifier,
        // other attributes
    ) {
        Box(
            modifier = modifier,
        ) {
            // other composables
        }
    }
    

    那你就这么称呼它

    Box {
        Image(<...>)
        RatingCircle(
            modifier = Modifier.align(/* alignment */)
        )
    }
    

    【讨论】:

    • 使用Modifier 类作为参数执行其他操作将触发 Lint 警告。我很感激这个警告。
    • 你指的是修饰符应该是第一个参数的默认值的警告吗?
    • 是的。我通过提供与 Modifier 对象实例不同的默认值来触发 lint 警告。
    • 是的,如果您检查 Jetpack Compose 库中的所有可组合项,您会发现它们都默认为 Modifier 而没有任何额外的属性,您应该这样做 - 让调用者在呼叫站点,这更加灵活。
    猜你喜欢
    • 2016-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多