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

Compose Multiplatform项目navigation-compose依赖同步失败求助

Compose Multiplatform桌面应用导航依赖问题

问题概述

我正在使用Compose Multiplatform构建桌面应用,需要实现导航功能。按照官方指南添加androidx.navigation:navigation-compose依赖后,Gradle同步失败;尝试降级到旧版本2.6.0虽能同步,但无法导入核心API(rememberNavController、NavHost)。

现有配置

/gradle/libs.versions.toml

[versions]
compose = "1.6.2"
compose-plugin = "1.6.0"
junit = "4.13.2"
kotlin = "1.9.22"
kotlin-serialization-json = "1.6.3"
ktor = "2.3.10"
coroutines = "1.8.0"
nav = "2.6.0"

[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
kotlin-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlin-serialization-json" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "compose" }
compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview", version.ref = "compose" }
compose-nav = { module = "androidx.navigation:navigation-compose", version.ref = "nav" }
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktor" }
ktor-client-engine = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }

[plugins]
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

/composeApp/build.gradle.kts

import org.jetbrains.compose.desktop.application.dsl.TargetFormat

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.kotlinSerialization)

    alias(libs.plugins.jetbrainsCompose)
}

kotlin {
    jvm("desktop")
    
    sourceSets {
        val desktopMain by getting
        
        commonMain.dependencies {
            implementation(compose.runtime)
            implementation(compose.foundation)
            implementation(compose.material)
            implementation(compose.ui)
            implementation(compose.components.resources)
            implementation(compose.components.uiToolingPreview)
//            implementation(kotlin.serialization.json)
            implementation(libs.ktor.client.core)
            implementation(libs.ktor.client.engine)
            implementation(libs.ktor.client.content.negotiation)
            implementation(libs.ktor.serialization.kotlinx.json)
            implementation(libs.kotlinx.coroutines.core)
            implementation(libs.compose.nav)
        }
        desktopMain.dependencies {
            implementation(compose.desktop.currentOs)
        }
    }
}


compose.desktop {
    application {
        mainClass = "MainKt"

        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
            packageName = "com.myproject"
            packageVersion = "1.0.0"
        }
    }
}

同步错误信息

:composeApp:commonMain: Could not resolve androidx.compose.animation:animation:1.5.1.
Required by:
    project :composeApp > androidx.navigation:navigation-compose:2.7.7

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

:composeApp:commonMain: Could not resolve androidx.compose.runtime:runtime:1.5.1.
Required by:
    project :composeApp > androidx.navigation:navigation-compose:2.7.7

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

尝试过的操作

  • 将navigation-compose版本降级到2.6.0,Gradle同步可通过,但无法导入rememberNavController和NavHost。

解决方案

1. 调整依赖放置位置

androidx.navigation:navigation-compose是AndroidX专属库,仅支持JVM(桌面/Android)平台,不能放在commonMain源集。修改composeApp/build.gradle.kts,将依赖移到desktopMain:

sourceSets {
    val desktopMain by getting
    
    commonMain.dependencies {
        // 保留原有common依赖,移除implementation(libs.compose.nav)
        implementation(compose.runtime)
        implementation(compose.foundation)
        implementation(compose.material)
        implementation(compose.ui)
        implementation(compose.components.resources)
        implementation(compose.components.uiToolingPreview)
        implementation(libs.ktor.client.core)
        implementation(libs.ktor.client.engine)
        implementation(libs.ktor.client.content.negotiation)
        implementation(libs.ktor.serialization.kotlinx.json)
        implementation(libs.kotlinx.coroutines.core)
    }
    desktopMain.dependencies {
        implementation(compose.desktop.currentOs)
        // 添加导航依赖到desktopMain
        implementation(libs.compose.nav)
    }
}

2. 补充仓库配置

在根项目的build.gradle.kts中添加Google Maven仓库,确保能获取AndroidX相关依赖:

plugins {
    alias(libs.plugins.kotlinMultiplatform) apply false
    alias(libs.plugins.jetbrainsCompose) apply false
    alias(libs.plugins.kotlinSerialization) apply false
}

allprojects {
    repositories {
        google()
        mavenCentral()
        maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
    }
}

3. 统一版本兼容性

将libs.versions.toml中的nav版本更新为与Compose 1.6.2兼容的2.7.7:

[versions]
# 其他版本不变
nav = "2.7.7"

4. 同步并验证

执行Gradle同步,之后即可在desktopMain的代码中正常导入并使用rememberNavController和NavHost。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:15:54