【问题标题】:Kotlin Multiplatform Dependency Injection with Annotations带有注释的 Kotlin 多平台依赖注入
【发布时间】: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


【解决方案1】:

我最终为 Kotlin Multiplatform (Kodein) 使用了不同的依赖注入库,但我认为这对任何有类似问题的人来说都是有帮助的,以了解我是如何解决它的。关键是使用以下代码向 Swift 公开生成的代码:

val iosMain by getting {
    ...
    kotlin.srcDir("${buildDir.absolutePath}/generated/source/kaptKotlin/")
}

此后,来自 Swift 的注入按预期工作。但是,我最终在尝试从多个模块中注入内容时遇到了更多问题,并且觉得 Kodein 对我目前正在尝试做的事情有更好的支持。

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2016-07-21
    相关资源
    最近更新 更多