【发布时间】:2021-11-18 00:29:07
【问题描述】:
我正在尝试在我的 Kotlin Multiplatform 项目中使用这个库进行依赖注入 - https://github.com/corbella83/PopKorn
该库基于kapt,Android 部分完美运行!但是,我很难理解为什么 iOS 似乎无法正常工作(我已经提交了一个问题,但想在这里问一下,以防我发出明显的问题)。
我有一个来自 KMM Android Studio 插件的开箱即用的香草 KMM 项目,具有以下与依赖项相关的设置:
// In shared/build.gradle.kts
kotlin {
...
sourceSets {
val commonMain by getting {
dependencies {
implementation("cc.popkorn:popkorn:2.1.1")
}
}
}
}
dependencies {
"kapt" ("cc.popkorn:popkorn-compiler:2.1.1") <- SHOULD THIS BE HERE?
}
// In androidApp/build.gradle.kts
dependencies {
implementation("cc.popkorn:popkorn:2.1.1")
}
// In commonMain source set
@Injectable
class Greeting {
fun greeting(): String {
return "Hello, ${Platform().platform}!"
}
}
// In MainActivity.kt
val greeting by popkorn<Greeting>() <- WORKS!
// In iosMain/Bridge.kt
fun init(creator: (ObjCClass) -> Mapping) = cc.popkorn.setup(creator)
fun getInjector() = InjectorObjC(popKorn())
// In iosApp
@main
struct iOSApp: App {
init() {
BridgeKt.doInit { (clazz) -> PopkornMapping in
return clazz.alloc() as! PopkornMapping
}
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
// In ContentView.swift
let greet = (BridgeKt.getInjector().inject(clazz: Greeting.self) as! Greeting).greeting()
我的错误是Could not find Provider for this class: com.example.myapplication.Greeting. Did you forget to add @Injectable?,这显然不是真的,因为我有注释。
我担心的是,当 android 编译时,我可以看到一些与使用 PopKorn 生成注释相关的日志,但是当我使用以下运行脚本(创建新项目时的默认设置)构建 iOS 应用程序时,我看不到这一点:
./gradlew :shared:embedAndSignAppleFrameworkForXcode
kapt 在 iOS 上工作是否需要任何其他设置?
【问题讨论】:
-
我猜你的 Kotlin 版本比这个库使用的要新得多。这可能会导致问题。我的第二个猜测是您缺少插件应用程序(如 here 所述),但我对 kapt 的使用并不熟悉,所以也许我在这里说的是非常愚蠢的事情。
-
@ArtyomDegtyarev 为了清楚起见,我没有在这里分享我的完整 gradle 文件,但我想如果没有那个位会有点混乱,但是是的,我添加了插件????
标签: kotlin gradle-kotlin-dsl kotlin-multiplatform kapt