#kotlin #gradle-kotlin-dsl #kotlin-multiplatform #kapt
Вопрос:
Я пытаюсь использовать эту библиотеку для внедрения зависимостей в рамках моего мультиплатформенного проекта Kotlin — https://github.com/corbella83/PopKorn
Библиотека основана на kapt
том, что часть Android работает отлично! Тем не менее, я изо всех сил пытаюсь понять, почему iOS, похоже, не работает (я зарегистрировал проблему с их стороны, но хотел спросить здесь на случай, если я замечу что-то очевидное).
У меня есть готовый проект ванильного KMM из плагина KMM для Android Studio со следующей настройкой, связанной с зависимостями:
// 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?
Комментарии:
1. Я бы предположил, что ваша версия Kotlin намного свежее, чем та, которую использовала эта библиотека. Это может вызвать проблему. Мое второе предположение состояло бы в том, что вам не хватает приложения для плагинов(как описано здесь ), но я не очень знаком с использованием kapt, так что, возможно, я говорю здесь довольно глупую вещь.
2. @ArtyomDegtyarev Я не делился своим полным файлом gradle здесь для ясности, но я думаю, что без этого было немного запутанно, но да, у меня есть добавленные плагины 👍
Ответ №1:
Я в конечном итоге использовал другую библиотеку для внедрения зависимостей для мультиплатформенной модели Kotlin (Кодеин), но для чего это стоит, я подумал, что было бы полезно для тех, у кого есть подобные проблемы, узнать, как я их решил. Ключ состоял в том, чтобы предоставить сгенерированный код Swift с помощью этого:
val iosMain by getting {
...
kotlin.srcDir("${buildDir.absolutePath}/generated/source/kaptKotlin/")
}
После этого инъекция от Свифта сработала так, как и предполагалось. Тем не менее, у меня возникло больше проблем при попытке внедрить что-то из нескольких модулей, и я почувствовал, что Кодейн лучше поддерживает то, что я пытаюсь сделать в данный момент.