Cedric Dupin
02/16/2023, 3:07 PMinterface LogInterface {
fun logTag(tag: String)
}
class LogInterfaceImpl: LogInterface {
override fun logTag(tag: String) {
Log.d("LogInterface", "Tag : $tag")
}
}
val logModule = module {
single<LogInterface> { LogInterfaceImpl() }
}
class Logger(private val tag: String): KoinComponent{
private val internalLogger: LogInterface by inject()
fun log(){
internalLogger.logTag(tag)
}
}
data class LoggerTest(val logger : Logger)
val loggerTest = LoggerTest(
Logger("TEST_1")
)
loggerTest.logger.log() // display "TEST_1" in logs
val loggerTestJson = "{\"logger\":{\"tag\":\"TEST_2\"}}"
val loggerTest2: LoggerTest = Gson().fromJson(loggerTestJson, LoggerTest::class.java)
loggerTest2.logger.log() // throw a NPE :
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object kotlin.Lazy.getValue()' on a null object reference
at Logger.getInternalLogger(line of "by inject()")
at Logger.log(line of "internalLogger.logTag(tag)")
I'm not very used to Koin, should I use scope / something else that "single" / ... ?
Thanks !Pedro Alberto
02/16/2023, 3:31 PMPedro Alberto
02/16/2023, 3:31 PMCedric Dupin
02/16/2023, 3:41 PMPedro Alberto
02/16/2023, 3:43 PMCedric Dupin
02/16/2023, 3:45 PMEmanuel Moecklin
02/17/2023, 3:22 AMinline fun <reified T> getKoinInstance() =
object : KoinComponent {
val value: T by inject()
}.value
and then retrieve the logger like this:
val internalLogger = getKoinInstances<LogInterface>()
Cedric Dupin
02/17/2023, 9:35 AMfun log() {
val internalLogger: LogInterface = get()
internalLogger.logTag(tag)
}