You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMP项目导入NavHostController失败,添加桌面页面遇异常

问题:KMP桌面端添加Navigation依赖后导入报错

问题场景

我开发了一个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模块的依赖不会自动共享给桌面端,需要单独配置:

  1. 修改kotlin.sourceSets.desktopMain.dependencies块,添加Navigation依赖:
desktopMain.dependencies {
    implementation(compose.desktop.currentOs)
    // 添加以下两行
    implementation(libs.androidx.navigation.runtime.ktx)
    implementation(libs.androidx.navigation.compose)
}
  1. 检查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" }
  1. 重新同步Gradle项目,IDE的红色报错即可消失。

内容的提问来源于stack exchange,提问作者user443654

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:41:02