首页 > 解决方案 > Kotlin 多平台库接口的暴露类型未解析

问题描述

我们有一个多模块的 android 项目,我们开始将其重构为一个 kotlin-multiplatform 项目,其中包含多个模块以与我们的 iOS 应用程序共享。

我们的多平台项目目前有 4 个模块:域、演示、数据和共享应用程序。shared-app 模块依赖于其他三个模块,这是导入到旧 android 项目中的模块。我们将这些模块合并为一个,只为 iOS 项目生成一个框架。

两个项目都成功构建。但是,如果我们检索在共享应用程序模块中定义的接口实例,该模块使用子模块中的类型,IDE 会显示 [ERROR : SomeType] 的返回类型。

在此处输入图像描述

在我们旧的 android 项目 settings.gradle 中,我们使用了 includeBuild(mpp-project) 并为 mpp-project 中的 shared-app 模块创建了一个依赖替换。

enableFeaturePreview("GRADLE_METADATA")

includeBuild("mpp-project") {
    dependencySubstitution {
        substitute(module("our.package.name:shared")).with(project(":shared-app"))
    }
}

另一方面,我们所有暴露的和传递导入的类型都可以在旧的 android 项目中实例化,甚至可以从子模块中实例化。(例如,我可以实例化 SomeType 并解决)

Gradle 项目结构:

oldAndroidRootProject
├─myApp (import implementation of all androidModules and mppFramework)
│  └─build.gradle
├─androidModule1
│  └─build.gradle
├─androidModule2
│  └─build.gradle
├─androidModule3
│  └─build.gradle
│
├─myMppRootProject
│   ├─mppFramework (depends on mppModuleXs and dependencies are declared as api(":mppModuleX"))
│   │   └─build.gradle
│   ├─mppModule1
│   │   └─build.gradle
│   ├─mppModule2
│   │   └─build.gradle
│   ├─mppModule3
│   │   └─build.gradle
│   ├─mppModule4
│   │   └─build.gradle
│   ├─build.gradle
│   └─settings.gradle (uses includeBuild("myMppRootProject"))
├─build.gradle
└─settings.gradle (uses includeBuild("myMppRootProject"))

如果我检查 mppFramework 模块源,当打开 androidRoot 项目时,我会看到:

在此处输入图像描述

标签: androidgradlekotlinmulti-modulekotlin-multiplatform

解决方案


如果我可以解释一下:

   -------
   - ios -
   -------
      |
   ----------
   - shared - ---------
   ----------          \
       |      \         \
   -------- ---------- ----------------
   - data - - domain - - presentation -
   -------- ---------- ----------------

如果shared是单点入口,则应通过标头公开依赖类型。这类东西的棘手部分是当你想要一些东西时,比如说,domain不包含在共享的公共调用中。如果不是这种情况,那么您正在做的事情应该有效。

如果您发布构建配置会很有帮助,这样我们就可以看到依赖项是如何配置的。另外,这在命令行上有效吗?有时 IDE 不工作,但构建正常。

另外,这是 Intellij 还是 Android Studio,什么版本?Intellij 在 KMP 方面往往是最新的。


推荐阅读