为采用 Google Billing API 信息(例如“ProductDetail”)的可组合项创建预览

Creating a Preview for a Composable that takes Google Billing API information such as a `ProductDetail`

提问人:James Olrog 提问时间:3/27/2023 最后编辑:James Olrog 更新时间:3/28/2023 访问量:37

问:

考虑具有以下参数的可组合屏幕:

@Composable
fun PurchaseSubscriptionScreenContent(
    availableSubscriptions: List<ProductDetails>,
    selectedSubscription: ProductDetails,
    isLoading: Boolean,
    onPurchaseClicked: () -> Unit,
) {...}

我想为此屏幕编写预览,但初始化是私有的,尝试这样做时会显示以下错误:ProductDetails

Cannot access '<init>': it is package-private in 'ProductDetails'

我不希望在预览版中使用 Google Billing API,因为这将涉及使用 Internet 连接。考虑到这些参数,我如何最好地为这个可组合项编写预览?

到目前为止,我能想到的唯一方法是使用更基本的类型并自己从 ProductDetails 进行映射?例如:

@Composable
fun PurchaseSubscriptionScreen(productDetails: List<ProductDetail>) {
    PurchaseSubscriptionScreenContent(
        subscritpionNames = productDetails.map { it.name },
        subscritpionDescriptions = productDetails.map { it.description },
        ...
    )
}

@Composable
fun PurchaseSubscriptionScreenContent(
    subscriptionNames: List<String>,
    subscriptionDescritpions: List<String>,
    subscriptionOfferDesceritpions: List<String>,
    ...
    isLoading: Boolean,
    onPurchaseClicked: () -> Unit,
) {...}

在视图模型中进行这种映射也是完全合理的,以便它是可测试的,但从头开始重新创建对象感觉有点烦人?欢迎任何其他想法。ProductDetail

安卓 android-jetpack-compose-预览 jetpack-compose

评论


答:

1赞 Derek K 3/28/2023 #1

一定要创建一个自定义类,例如具有适当映射方法的 a。然后只需在业务逻辑、查看模型和可组合项中使用它。View 不应知道使用的库。这样,除了预览和可测试性之外,还可以保护代码免受计费库更改的影响。Product