android 我们是否也可以或应该为主部件使用预览合成功能?

qhhrdooz  于 2022-11-20  发布在  Android
关注(0)|答案(1)|浏览(109)

下面是两个函数

@Composable
private fun WaterCounter(modifier: Modifier = Modifier) {
    val count = 0
    Text(
        text = "You've had $count glasses of water",
        modifier = modifier.padding(all = 16.dp)
    )
}

@Preview(showBackground = true)
@Composable
private fun PreviewWaterCounter() {
    WaterCounter()
}

因此,如果我们在WaterCounter中添加@Preview注解,这将保存一些代码行,并同时作为预览和小部件工作,不是更好吗?

1bqhqjot

1bqhqjot1#

对于像您发布的代码这样的简单情况,拥有一个单独的可组合预览似乎有点太多了,但是考虑一下这个场景,其中有两个具有非默认参数的可组合,

@Composable
fun PersonBiography(
    details: Data,
    otherParameters : Any?
) {
    Box(
        modifier = Modifier.background(Color.Red)
    ) {
        Text(details.dataValue)
    }
}

@Composable
fun AccountDetails(
    details: Data
) {
    Box(
        modifier = Modifier.background(Color.Green)
    ) {
        Text(details.dataValue)
    } 
}

这两个都需要相同的数据类,第一个有一个额外的参数。2如果我必须预览它们,我必须打破他们的签名,分配默认值给他们只是为了预览。

@Preview
@Composable
fun PersonBiography(
    details: Data = Data(dataValue = ""),
    otherParameters : Any? = null
) { … }

@Preview
@Composable
fun AccountDetails(
    details: Data = Data(dataValue = "")
) { … }

一个很好的解决办法是有2个单独的预览合成,并利用PreviewParameterProvider有一个可重用的实用程序,可以提供我需要的参数的示例。

class DetailsPreviewProvider : PreviewParameterProvider<Data> {
    override val values = listOf(Data(dataValue = "Some Data")).asSequence()
}

@Preview
@Composable
fun PersonBiographyPreview(@PreviewParameter(DetailsPreviewProvider::class) details: Data) {
    PersonBiography(
        details = details,
        // you may also consider creating a separate provider for this one if needed
        null
    )
}

@Preview
@Composable
fun AccountDetailsPreview(@PreviewParameter(DetailsPreviewProvider::class) details: Data) {
    AccountDetails(details)
}

或者,如果PreviewParameterProvider有点太多,您可以简单地创建一个预览组合,在其中您可以创建和提供模拟数据。

@Preview
@Composable
fun AccountDetailsPreview() {
    val data = Data("Some Account Information")
    AccountDetails(data)
}

使用这些方法中的任何一种,您都不需要破坏实际的可组合对象的结构,只是为了看一看它的样子。

相关问题