Android75
10/02/2025, 3:20 PMdebugImplementation so i can't use @Preview.
debugImplementation is not resolved
this is module's gradle.
plugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.android.lint)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.kotlin.serialization)
}
kotlin {
androidLibrary {
experimentalProperties["android.experimental.kmp.enableAndroidResources"] = true
}
androidLibrary {
namespace = "com.plcoding.core.designsystem"
compileSdk = 36
minSdk = 24
withHostTestBuilder {
}
withDeviceTestBuilder {
sourceSetTreeName = "test"
}.configure {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
val xcfName = "core:designsystemKit"
iosX64 {
binaries.framework {
baseName = xcfName
}
}
iosArm64 {
binaries.framework {
baseName = xcfName
}
}
iosSimulatorArm64 {
binaries.framework {
baseName = xcfName
}
}
sourceSets {
commonMain {
dependencies {
implementation(libs.kotlin.stdlib)
implementation(projects.core.presentation)
implementation(libs.jetbrains.compose.foundation)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.material3.adaptive)
implementation(libs.jetbrains.compose.ui)
implementation(libs.jetbrains.compose.foundation)
implementation(libs.jetbrains.compose.material3)
implementation(libs.jetbrains.compose.material.icons.core)
}
}
androidMain {
dependencies {
}
}
iosMain {
dependencies {
}
}
}
}Dequency Yates
10/02/2025, 3:30 PMdebugImplementation (and releaseImplementation) are Android-specific Gradle configurations. They are not automatically available in the kotlin {} block of a KMP module unless you’re explicitly in the Android-specific android Gradle block. That’s why debugImplementation is “not resolved.”Android75
10/02/2025, 3:32 PMDequency Yates
10/02/2025, 3:32 PMAndroid75
10/02/2025, 3:33 PMAndroid75
10/02/2025, 3:34 PMAndroid75
10/02/2025, 3:35 PMDequency Yates
10/02/2025, 3:37 PMdependencies { debugImplementation(...) } inside the android { } block. The Android Gradle plugin expects dependencies { ... } at the module level, not inside android { }.
androidMain {
dependencies {
implementation(compose.components.uiToolingPreview) // @Preview works
}
}
This works for Compose previews without needing debugImplementation
No android { dependencies { ... } } required.Android75
10/02/2025, 3:48 PMandroidMain {
dependencies {
implementation(compose.components.uiToolingPreview)
implementation("androidx.compose.ui:ui-tooling-preview:1.9.0")
}
}Android75
10/02/2025, 3:48 PMAndroid75
10/02/2025, 3:49 PMAndroid75
10/02/2025, 3:50 PMplugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.android.lint)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.kotlin.serialization)
}
kotlin {
androidLibrary {
experimentalProperties["android.experimental.kmp.enableAndroidResources"] = true
}
androidLibrary {
namespace = "com.plcoding.core.designsystem"
compileSdk = 36
minSdk = 24
withHostTestBuilder {
}
withDeviceTestBuilder {
sourceSetTreeName = "test"
}.configure {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
val xcfName = "core:designsystemKit"
iosX64 {
binaries.framework {
baseName = xcfName
}
}
iosArm64 {
binaries.framework {
baseName = xcfName
}
}
iosSimulatorArm64 {
binaries.framework {
baseName = xcfName
}
}
sourceSets {
commonMain {
dependencies {
implementation(libs.kotlin.stdlib)
implementation(projects.core.presentation)
implementation(libs.jetbrains.compose.foundation)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.material3.adaptive)
implementation(libs.jetbrains.compose.ui)
implementation(libs.jetbrains.compose.foundation)
implementation(libs.jetbrains.compose.material3)
implementation(libs.jetbrains.compose.material.icons.core)
}
}
androidMain {
dependencies {
implementation(compose.components.uiToolingPreview)
implementation("androidx.compose.ui:ui-tooling-preview:1.9.0")
}
}
iosMain {
dependencies {
}
}
}
}Android75
10/02/2025, 4:05 PMDequency Yates
10/02/2025, 4:38 PMui-tooling as a debug dependency. In your module's dependencies {} (top-level, not in sourceSets):
dependencies {
debugImplementation("androidx.compose.ui:ui-tooling:1.9.0")
}
ui-tooling must not be in implementation, because it will bloat your APK. That’s why debugImplementation is the right scope.
Keep your actual @Preview functions in androidMain (not commonMain), otherwise Studio won’t find them.
kotlin {
androidLibrary()
iosX64()
iosArm64()
iosSimulatorArm64()
sourceSets {
commonMain {
dependencies {
implementation(libs.kotlin.stdlib)
implementation(projects.core.presentation)
implementation(libs.jetbrains.compose.foundation)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview) // preview annotation available everywhere
implementation(libs.material3.adaptive)
implementation(libs.jetbrains.compose.ui)
implementation(libs.jetbrains.compose.foundation)
implementation(libs.jetbrains.compose.material3)
implementation(libs.jetbrains.compose.material.icons.core)
}
}
androidMain {
dependencies {
implementation(compose.components.uiToolingPreview) // needed in Android
implementation("androidx.compose.ui:ui-tooling-preview:1.9.0")
}
}
}
}
dependencies {
// Needed so Studio can actually render the previews
debugImplementation("androidx.compose.ui:ui-tooling:1.9.0")
}Android75
10/02/2025, 5:32 PMAndroid75
10/02/2025, 5:33 PMAndroid75
10/02/2025, 5:49 PMAndroid75
10/02/2025, 5:54 PMplugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.kotlin.serialization)
}
kotlin {
androidLibrary {
experimentalProperties["android.experimental.kmp.enableAndroidResources"] = true
}
androidLibrary {
namespace = "com.plcoding.core.designsystem"
compileSdk = 36
minSdk = 24
withHostTestBuilder {
}
withDeviceTestBuilder {
sourceSetTreeName = "test"
}.configure {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
val xcfName = "core:designsystemKit"
iosX64 {
binaries.framework {
baseName = xcfName
}
}
iosArm64 {
binaries.framework {
baseName = xcfName
}
}
iosSimulatorArm64 {
binaries.framework {
baseName = xcfName
}
}
sourceSets {
commonMain {
dependencies {
implementation(libs.kotlin.stdlib)
implementation(projects.core.presentation)
implementation(libs.jetbrains.compose.foundation)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.material3.adaptive)
implementation(libs.jetbrains.compose.ui)
implementation(libs.jetbrains.compose.foundation)
implementation(libs.jetbrains.compose.material3)
implementation(libs.jetbrains.compose.material.icons.core)
}
}
androidMain {
dependencies {
implementation(compose.components.uiToolingPreview) // needed in Android
implementation("androidx.compose.ui:ui-tooling-preview:1.9.0")
}
}
iosMain {
dependencies {
}
}
}
}
dependencies {
// Needed so Studio can actually render the previews
debugImplementation("androidx.compose.ui:ui-tooling:1.9.0")
}Dequency Yates
10/02/2025, 6:00 PMui-tooling-preview in androidMain
Move debugImplementation(ui-tooling) into `androidMain`’s dependencies block, not top-level.
Don’t try to put a dependencies { debugImplementation(...) } after the kotlin {} block in KMP.
sourceSets {
androidMain {
dependencies {
implementation(compose.components.uiToolingPreview) // annotation
implementation("androidx.compose.ui:ui-tooling-preview:1.9.0")
debugImplementation("androidx.compose.ui:ui-tooling:1.9.0") // <- put here, not top-level
}
}
}Android75
10/02/2025, 6:00 PMAndroid75
10/02/2025, 6:18 PMplugins {
alias(libs.plugins.kotlin.multiplatform)
alias(libs.plugins.android.kotlin.multiplatform.library)
alias(libs.plugins.compose.multiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.kotlin.serialization)
}
kotlin {
androidLibrary {
experimentalProperties["android.experimental.kmp.enableAndroidResources"] = true
}
androidLibrary {
namespace = "com.plcoding.core.designsystem"
compileSdk = 36
minSdk = 24
withHostTestBuilder {
}
withDeviceTestBuilder {
sourceSetTreeName = "test"
}.configure {
instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
val xcfName = "core:designsystemKit"
iosX64 {
binaries.framework {
baseName = xcfName
}
}
iosArm64 {
binaries.framework {
baseName = xcfName
}
}
iosSimulatorArm64 {
binaries.framework {
baseName = xcfName
}
}
sourceSets {
commonMain {
dependencies {
implementation(libs.kotlin.stdlib)
implementation(projects.core.presentation)
implementation(libs.jetbrains.compose.foundation)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.material3.adaptive)
implementation(libs.jetbrains.compose.ui)
implementation(libs.jetbrains.compose.foundation)
implementation(libs.jetbrains.compose.material3)
implementation(libs.jetbrains.compose.material.icons.core)
}
}
androidMain {
dependencies {
implementation(compose.components.uiToolingPreview) // annotation
implementation("androidx.compose.ui:ui-tooling-preview:1.9.0")
debugImplementation("androidx.compose.ui:ui-tooling:1.9.0") // <- put here, not top-level
}
}
iosMain {
dependencies {
}
}
}
}Michael Krussel
10/02/2025, 6:29 PMsrc/androidDebug
https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-android-layout.html#move-the-androidmanifest-xml-file
So I would expected
kotlin {
sourceSets {
androidDebug {
implementation("...")
}
}
}
The IDE doesn't recognize it so I don't know if that is right.Konstantin Tskhovrebov
10/02/2025, 8:50 PMandroidLibrary
has problems with previewsKonstantin Tskhovrebov
10/02/2025, 8:51 PMAndroid75
10/03/2025, 3:10 AMAndroid75
10/03/2025, 3:54 AMAndroid75
10/03/2025, 4:24 AMandroidMain {
dependencies {
implementation(compose.uiTooling)
implementation(compose.preview)
implementation(libs.androidx.activity.compose)
implementation("androidx.emoji2:emoji2:1.5.0")
implementation("androidx.customview:customview-poolingcontainer:1.1.0")
}
}