Guilherme Delgado
07/24/2024, 12:11 PMcore-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?Guilherme Delgado
07/24/2024, 12:11 PMdata-managers
commonMain
package com.magic.data.managers
@HiddenFromObjC
expect fun diModule(): Module
androidMain
actual fun diModule() = module {
single { CardsManager() }
}
iosMain
@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
)
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:
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
.Guilherme Delgado
07/24/2024, 12:12 PMGuilherme Delgado
07/24/2024, 5:29 PM