代码之家  ›  专栏  ›  技术社区  ›  me.at.coding

为什么我们在共享模块中除了安卓项目的build.gradle.kts之外还有androidMain?

  •  0
  • me.at.coding  · 技术社区  · 1 年前

    在KMM中,我们有 build.gradle.kts 对于共享模块,该共享模块包括:

    sourceSets {
        val commonMain by getting {
            dependencies {
                //put your multiplatform dependencies here
                // ...
            }
        }
        val androidMain by getting { // note androidMain here
            dependencies {
                // some stuff like sqldelight android driver goes here
            }
        }
    
        // ...
    }
    

    此外,我们还有 build.gradle.kts androidApp 文件夹

    那么,什么时候可以在 androidMain 共享模块的部分 build.gradle.kts 什么时候可以把它放进 build.gradle.kts androidApp 文件夹为什么我们有 androidMain 部分 build.gradle.kts 如果共享模块应该是独立于平台的?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Kevin Galligan    1 年前

    如果共享模块应该是独立于平台的,为什么我们在共享模块的build.gradle.kts中有一个androidMain部分?

    共享模块不是独立于平台的。例如,源集可以是 commonMain 。但是,您可以 androidMain , iosMain 等等。这些源集是特定于平台的。

    如果您正在使用 expect/actual ,编译器将寻求满足所有 expect 声明。所以,假设你已经:

    expect fun hello():String
    

    如果您将Android和iOS定义为目标,则需要 actual 在共享的Kotlin模块中为每一个提供。

    在里面 androidMain :

    actual fun hello() = "Hi from Android"
    

    在里面 iosMain :

    actual fun hello() = "Hi from iOS"
    

    如果编译器找不到匹配项 真实的 每个目标都要满足 预料 ,生成将失败。你不能放那些 真实的 中的声明 androidApp 。它们需要在共享模块中直接得到满足。