Внедрение мультиплатформенной зависимости Kotlin с аннотациями

#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/")
}
 

После этого инъекция от Свифта сработала так, как и предполагалось. Тем не менее, у меня возникло больше проблем при попытке внедрить что-то из нескольких модулей, и я почувствовал, что Кодейн лучше поддерживает то, что я пытаюсь сделать в данный момент.