小编Hen*_*ing的帖子

如何使用@PreviewParameter注解?

我正在尝试预览一个以一个字符串参数作为输入的可组合项。我不确定@PreviewParameter注释应该如何使用。

这是我尝试过的

class DogProvider : PreviewParameterProvider<String> {
    override val values = listOf("Bela", "Stalone").asSequence()
}

@PreviewParameter(DogProvider::class)
@Composable
fun OverviewCard(
    dog: String,
    modifier: Modifier = Modifier
) {
    Text(dog)
}
Run Code Online (Sandbox Code Playgroud)

不渲染预览。如果我还添加@Preview注释,它表示我应该使用@PreviewParameter

android-jetpack-compose

19
推荐指数
2
解决办法
2万
查看次数

当对话框中显示时,如何防止 jetpack compose 脚手架占据屏幕的整个高度

我有一个 Android 活动,它Base.Theme.AppCompat.Light.Dialog在平板电脑上作为主题,因此显示在对话框中。

当我使用 XML 布局时,我可以设置布局的最小高度和换行内容,这样它就会

  • 当没有内容或内容很少时,至少为 x dp 高。
  • 当内容高于最小高度时内容就高
  • 当内容不适合屏幕高度时,与屏幕一样高,在这种情况下我可以滚动

使用 Jetpack Compose 的脚手架,我正在努力重现这种行为。即使没有内容,对话框的高度也始终与屏幕允许的一样高。

我尝试了以下修饰符作为脚手架的参数:

  • Modifier.wrapContentHeight()- 对话框仍然与屏幕一样高
  • Modifier.defaultMinSize(minHeight = 250.dp)- 对话框仍然与屏幕一样高
  • Modifier.height(height = 250.dp)- 现在它变小了,但它固定为该大小,当内容更多时不会增长
  • Modifier.requiredHeightIn(min = 250.dp, max = getMyScreenHeightinDp())- 对话框仍然与屏幕一样高

由于您可以使用修改器降低脚手架的高度,.height(...)我认为也应该可以重新创建包装内容行为。但如何呢?

android scaffold android-jetpack-compose

8
推荐指数
1
解决办法
4184
查看次数

如何使用 MockK 模拟构建器以使构建器函数可交换?

我得到了一些代码,我想使用 MockK 作为模拟库来测试它们:

fun loadImage(imageLoader: coil.ImageLoader) {
    val request = ImageRequest.Builder(imageView.context)
        .data(url)
        .crossfade(true)
        .build()
    imageLoader.enqueue(request)
}
Run Code Online (Sandbox Code Playgroud)

我可以使用分层方法来模拟它:


val request: ImageRequest = mockk()
val imageLoader: coil.ImageLoader = mockk(relaxed = true)
mockkConstructor(ImageRequest.Builder::class)
every { anyConstructed<ImageRequest.Builder>().data(any()) } returns mockk {
    every { crossfade(any<Boolean>()) } returns mockk {
        every { build() } returns request
    }
}

loadImage(imageLoader)

verify { imageLoader.enqueue(request) }
Run Code Online (Sandbox Code Playgroud)

所以这是有问题的,因为我还测试了构建器函数的调用顺序。当我切换.data.crossfade调用时,测试会中断,而实现仍然有效。

有更好的方法来解决这个问题吗?

android unit-testing mocking mockk

7
推荐指数
1
解决办法
1706
查看次数

由于构建风格问题,无法添加动态功能模块

我想在现有的应用程序中实现一个新的动态功能模块,但由于产品风味问题而不得不放弃。

示例代码可以在这里找到。https://github.com/henningBunk/dynamic_feature_problem

我有三个模块:

  1. 应用程序。应用程序的主要模块。它有两种产品口味:

store:amazongoogle
pay_status:freepro

产生四种组合 :amazonFreeamazonProgoogleFreegooglePro

它取决于lib并列dynamic_feature为动态功能。

  1. 库。一个库模块,app并且dynamic_feature依赖于这个模块。lib只有味道pay_status。所以当我构建例如时。将应用程序作为googleFree风味,lib 将构建它的free风味。

  2. 动态特征。新功能应该是动态功能。这个模块不应该有任何风格。这取决于应用程序和库。

三个 gradle 文件简化为产品风格和依赖项,如下所示:

应用程序模块build.gradle:

apply plugin: 'com.android.application'

android {
    dynamicFeatures = [":faq"]

    flavorDimensions "store", "pay_status"

    productFlavors {
        google { dimension "store" }
        amazon { dimension "store" }

        free { dimension "pay_status" }
        pro { dimension "pay_status" } …
Run Code Online (Sandbox Code Playgroud)

dependencies android gradle dynamic-feature

6
推荐指数
1
解决办法
2053
查看次数

使用 Gradle Kotlin-DSL 时,如何使用flavorDimensions为每种风味组合设置不同的applicationId?

我正在使用 Kotlinscript 文件将 Android 应用程序转换为 Gradle Kotlin-DSL。

我在转换逻辑时遇到问题applicationId。我们不使用defaultConfigurationwith applicationIdplus 各种applicationIdSuffix口味来表达我们的口味,而是使用自定义逻辑。这个逻辑在这个 SO 答案中进行了描述,下面是常规代码:

flavorDimensions "price", "dataset"

productFlavors {
    free { dimension "price" }
    paid { dimension "price" }
    dataset1 { dimension "dataset" }
    dataset2 { dimension "dataset" }
}

android.applicationVariants.all { variant ->
    def mergedFlavor = variant.mergedFlavor
    switch (variant.flavorName) {
        case "freeDataset1":
            mergedFlavor.setApplicationId("com.beansys.freeappdataset1")
            break
        case "freeDataset2":
            mergedFlavor.setApplicationId("com.beansys.freedataset2")
            break
        case "paidDataset1":
            mergedFlavor.setApplicationId("com.beansys.dataset1paid")  
            break
        case "paidDataset2":
            mergedFlavor.setApplicationId("com.beansys.mypaiddataset2")
            break
    }
}
Run Code Online (Sandbox Code Playgroud)

对于 kotlin,我无法改变groovy 中的类似applicationId …

android gradle gradle-kotlin-dsl

6
推荐指数
1
解决办法
3319
查看次数

Jetpack Compose 中的 TextClock 相当于什么?

TextClock是 Android XML 布局的小部件,它可以自行保存和显示时间。您只需添加格式和时区。

目前我在 Jetpack Compose 中没有看到类似的东西。我应该使用文本可组合项和一些时间格式化库自己实现它吗?我应该膨胀 TextClock 并利用向后兼容性吗?或者有现成的组件吗?

android android-jetpack-compose

6
推荐指数
1
解决办法
1897
查看次数