kotlin 如何在jetpack composite中对数据类进行封装

2ledvvac  于 2023-05-18  发布在  Kotlin
关注(0)|答案(3)|浏览(125)

我有一个数据类,其中一个变量的类型是Color。我有逻辑来存储不同类型的颜色显示在UI即。

data class SubTitleModel(
    val text: String,
    val textColor: Color = Color.Black
)

当我从一个活动传递到另一个活动时,我必须使用@Parcelize,即

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class SubTitleModel(
    val text: String,
    val textColor: Color = Color.Black
) : Parcelable

Color上显示错误

Type is not directly supported by 'Parcelize'. Annotate the parameter type with '@RawValue' if you want it to be serialized using 'writeValue()'

这意味着什么如何解决这一问题?请提供详细的解释与适当的参考。谢谢

ssgvzors

ssgvzors1#

另一个选项是传递Int或Long,而不是传递Compose Color,例如

data class SubTitleModel(
    val text: String,
    val textColor: Int = (0xFF000000).toInt()
)

然后在您的ui中

@Preview
@Composable
private fun Test() {
    val modelList = listOf(
        SubTitleModel(
            text = "SomeText"
        ),
        SubTitleModel(
            text = "SomeText2",
            textColor = Color.Red.toArgb()
        ),
        SubTitleModel(
            text = "SomeText3",
            textColor = Color.Green.toArgb()
        )
    )

    Column(
        modifier = Modifier
            .fillMaxSize()
            .padding(20.dp)
            .border(2.dp, Color.Red)
    ) {
        modelList.forEach { model: SubTitleModel ->
            Text(text = model.text, color = Color(model.textColor))
        }
    }
}
vx6bjr1n

vx6bjr1n2#

正如我们所知,颜色是一种资源,我们可以在colors.xmlColor.kt中保存,因此我们可以在这种情况下使用颜色 Package 器来存储传入的颜色,以便在需求发生变化时不会中断(某些视图可能是xml)。
这基本上是 Package ,可以接受这两种类型的颜色,我们不想担心它来自哪里。它可以来自XML或Kotlin文件。

@Parcelize
sealed class ColorWrapper : Parcelable {
    data class ColorResource(
        val resource: Int,
        val text: String,
    ) : ColorWrapper()

    data class ColorHex(
        val hex: ULong,
        val text: String,
    ) : ColorWrapper()
}

fun ULong.toColor() = Color(this)

然后我们可以用这些颜色来构图。

@Composable
fun Test() {
    val colors = listOf(
        ColorWrapper.ColorResource(R.color.black, "Black"),
        ColorWrapper.ColorHex(Color.Black.value, "Black"),
    )
    colors.forEach { model: ColorWrapper ->
        when (model) {
            is ColorWrapper.ColorHex -> {
                TextView(text = model.text, color = model.hex.toColor())
            }

            is ColorWrapper.ColorResource -> {
                TextView(text = model.text, color = colorResource(model.resource))
            }
        }
    }
}

@Composable
fun TextView(text: String, color: Color) {
    Text(text = text, fontSize = 30.sp, color = color)
}

这不是矫枉过正的解决方案,对我来说是一个愿景或最佳实践。顺便说一句,色雷斯人的回答更适合你的情况。我按照你的要求发布了这个。

lfapxunr

lfapxunr3#

您需要为该值使用@RawValue注解。试着像这样修改textColor

val textColor: @RawValue Color = Color.Black

相关问题