我们也可以或应该为主小部件使用预览撰写功能吗?

Can we or should use Preview compose function for main widget as well?

提问人:Tehleel Mir 提问时间:11/19/2022 最后编辑:Tehleel Mir 更新时间:11/20/2022 访问量:528

问:

下面有两个函数

@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

Android Kotlin android-jetpack-compose-preview

评论


答:

1赞 z.g.y 11/19/2022 #1

对于像您发布的代码这样的简单情况,拥有单独的可组合预览似乎有点太多了,但请考虑此方案,其中包含 2 个具有非默认参数的可组合项,

@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)
    } 
}

它们都需要相同的数据类,第一个具有附加参数。如果我必须预览它们,我必须破坏它们的签名,为它们分配默认值只是为了预览。

@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)
}

enter image description here

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

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

enter image description here

使用这些方法中的任何一种,您都不需要为了一瞥它的外观而破坏实际可组合项的结构。