Hello! I am experiencing an issue in my KMP multi-...
# koin
g
Hello! I am experiencing an issue in my KMP multi-module project, specifically related to DI initialization. My project includes several modules, among which
core-di
and
data-managers
. I aim to separate the DI logic within each module rather than adopting a monolithic approach. My setup in 🧵. This setup works fine on Android, but I encounter an issue on iOS it throws a
kotlin.IllegalStateException: KoinApplication has not been started
. What am I missing in the DI initialization for iOS? How can I ensure that Koin is properly initialized with this multimodule setup?
Module:
data-managers
commonMain
Copy code
package com.magic.data.managers
@HiddenFromObjC
expect fun diModule(): Module
androidMain
Copy code
actual fun diModule() = module {
    single { CardsManager() }
}
iosMain
Copy code
@OptIn(ExperimentalObjCRefinement::class)
@HiddenFromObjC
actual fun diModule() = module {
    factory { CardsManager() }
}

@Suppress("unused")
object ManagersProvider : KoinComponent {
    fun cardsManager(): CardsManager = get()
}
Module:
core-di
(implements
data-managers
)
Copy code
object DependencyInjection {
    
    @Suppress("unused")
    fun initKoin() = initKoin(enableNetworkLogs = false)

    @HiddenFromObjC
    fun initKoin(enableNetworkLogs: Boolean = false, appDeclaration: KoinAppDeclaration = {}) {
        startKoin {
            appDeclaration()
            modules(
                commonModule(enableNetworkLogs = enableNetworkLogs),
                com.magic.data.managers.diModule()
            )
        }
    }
}
The relevant part of my iOS code:
Copy code
import CoreDi
import DataManagers

@main
struct MagicApp: App {
    init() {
        DependencyInjection().initKoin()
        let manager = ManagersProvider().cardsManager() 
    }
    ...
}
The line
let manager = ManagersProvider().cardsManager()
throws a
kotlin.IllegalStateException: KoinApplication has not been started
.
But the same setup on Android, works.