KMP项目导入NavHostController失败,添加桌面页面遇异常
问题场景
我开发了一个KMP应用,正尝试添加第二个桌面端页面。当前代码中导入androidx.compose.navigation.NavHostController及相关代码时显示红色报错,代码如下:
import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.Button import androidx.compose.material.MaterialTheme import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import kotlinx.datetime.Clock import kotlinx.datetime.LocalDateTime import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.painterResource import androidx.compose.navigation.NavHostController import androidx.compose.navigation.composeNavHost import pellettracker.composeapp.generated.resources.Res import pellettracker.composeapp.generated.resources.compose_multiplatform
当前项目的build.gradle.kts配置如下:
import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.androidApplication) alias(libs.plugins.jetbrainsCompose) id("io.realm.kotlin") version "1.11.0" } kotlin { androidTarget { compilations.all { kotlinOptions { jvmTarget = "11" } } } jvm("desktop") sourceSets { val desktopMain by getting androidMain.dependencies { implementation(libs.compose.ui.tooling.preview) implementation(libs.androidx.activity.compose) } commonMain.dependencies { implementation(compose.runtime) implementation(compose.foundation) implementation(compose.material) implementation(compose.ui) implementation(compose.components.resources) implementation(compose.components.uiToolingPreview) implementation(libs.kotlinx.datetime) implementation(libs.library.base) implementation(libs.library.sync) // If using Device Sync implementation(libs.kotlinx.coroutines.core) // If using coroutines with the SDK } desktopMain.dependencies { implementation(compose.desktop.currentOs) } } } android { namespace = "org.ohw.pellettracker" compileSdk = libs.versions.android.compileSdk.get().toInt() sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") sourceSets["main"].res.srcDirs("src/androidMain/res") sourceSets["main"].resources.srcDirs("src/commonMain/resources") defaultConfig { applicationId = "org.ohw.pellettracker" minSdk = libs.versions.android.minSdk.get().toInt() targetSdk = libs.versions.android.targetSdk.get().toInt() versionCode = 1 versionName = "1.0" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } buildTypes { getByName("release") { isMinifyEnabled = false } } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } dependencies { debugImplementation(libs.compose.ui.tooling) compileOnly(libs.library.base) implementation(libs.androidx.navigation.runtime.ktx) implementation(libs.androidx.navigation.compose) } } compose.desktop { application { mainClass = "MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "org.ohw.pellettracker" packageVersion = "1.0.0" } } }
我已经按照文档添加了implementation(libs.androidx.navigation.runtime.ktx)和implementation(libs.androidx.navigation.compose)依赖,也试过同步项目、重启IDE,但问题仍未解决,想问是否遗漏了其他配置?
解决方案
问题核心是Navigation依赖仅添加到了Android模块,桌面端(desktopMain)未引入对应依赖。KMP的依赖按sourceSet隔离管理,Android模块的依赖不会自动共享给桌面端,需要单独配置:
- 修改
kotlin.sourceSets.desktopMain.dependencies块,添加Navigation依赖:
desktopMain.dependencies { implementation(compose.desktop.currentOs) // 添加以下两行 implementation(libs.androidx.navigation.runtime.ktx) implementation(libs.androidx.navigation.compose) }
- 检查
libs.versions.toml文件,确保已正确配置Navigation的版本(如果没有则添加):
[versions] androidxNavigationCompose = "2.7.7" # 可根据需求调整版本 [libraries] androidx-navigation-runtime-ktx = { module = "androidx.navigation:navigation-runtime-ktx", version.ref = "androidxNavigationCompose" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidxNavigationCompose" }
- 重新同步Gradle项目,IDE的红色报错即可消失。
内容的提问来源于stack exchange,提问作者user443654
相关产品推荐
相关产品推荐

