android - 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 项目时,我会看到:
解决方案
如果我可以解释一下:
-------
- ios -
-------
|
----------
- shared - ---------
---------- \
| \ \
-------- ---------- ----------------
- data - - domain - - presentation -
-------- ---------- ----------------
如果shared
是单点入口,则应通过标头公开依赖类型。这类东西的棘手部分是当你想要一些东西时,比如说,domain
不包含在共享的公共调用中。如果不是这种情况,那么您正在做的事情应该有效。
如果您发布构建配置会很有帮助,这样我们就可以看到依赖项是如何配置的。另外,这在命令行上有效吗?有时 IDE 不工作,但构建正常。
另外,这是 Intellij 还是 Android Studio,什么版本?Intellij 在 KMP 方面往往是最新的。
推荐阅读
- php - Laravel cli db connect 工作正常(迁移),但网络调用抛出“找不到”驱动程序错误(odbc)
- javascript - mongodb最近7天数据总和数据需要日期对象
- swift - 当两个物体接触/碰撞时尝试打印一些东西。稍后将在球触及桶底时添加得分
- css - Bootstrap Button Primary 在单击或激活时会保持蓝色一秒钟,即使被覆盖也是如此
- django - 如何在 django rest 框架中保存时间戳字段
- java - 将时间戳转换为字符串而不指定格式
- javascript - 如何以角度获取复选框值?
- linux - 从 1.5.8 升级到 1.6.7 后,未绑定速度降低 50%
- xml - XML 电话验证
- javascript - 检查值是否为时间戳的最佳方法是什么?