Halo dev, ceritanya saya lagi bikin app B yang patternnya mirip sekali dengan app saya sebelumnya, sebut saja app A, kebetulan di app A itu versi kotlinnya masih jadul, tapi saya tidak berani memperbaruinya karena masih trauma dengan kasus-kasus yang pernah saya alami sebelumnya, seperti update versi kotlin yang berdampak sistemik ke seluruh kode saya, tentu ini sangat merepotkan apalagi app A saya sudah running production.
Oke, dikesempatan kedua ini saya membuat aplikasi yang hampir sama patternnya dan bisnis logicnya, sehingga saya beranikan diri untuk update versi kotlinnya, tentu saja karena project ini masih dimulai. Oke, setelah saya eksekusi apa yang terjadi? boom! dugaan saya benar, pasi ada aja error yang muncul, dan kebetulan error itu adalah ini.
Fatal Exception: java.lang.NoSuchMethodError: No virtual method elapsedNow()D in class Lkotlin/time/TimeMark; or its super classes (declaration of 'kotlin.time.TimeMark' appears in /data/app/com.bundet.xxx-XuYb7W13RtLdaJ7MMWdrbQ==/base.apk:classes3.dex)
at org.koin.core.time.MeasureKt.measureDuration(Measure.kt:36)
at org.koin.core.KoinApplication.modules(KoinApplication.kt:60)
at org.koin.core.KoinApplication.modules(KoinApplication.kt:43)
at com.bundet.xxx.repository.di.AppBase$onCreate$1.invoke(AppBase.kt:18)
at com.bundet.xxx.repository.di.AppBase$onCreate$1.invoke(AppBase.kt:9)
at org.koin.core.context.ContextFunctionsKt.startKoin(ContextFunctions.kt:39)
at org.koin.core.context.ContextFunctionsKt.startKoin$default(ContextFunctions.kt:35)
at com.bundet.xxx.repository.di.AppBase.onCreate(AppBase.kt:15)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5791)
at android.app.ActivityThread.-wrap1()
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1661)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Solusi
Ubah cara load modul koin menjadi seperti ini:
Sebelum.
startKoin {
androidLogger()
androidContext(this@MyApplication)
modules(myModule)
}
Sesudah.
startKoin {
androidLogger()
androidContext(this@MyApplication)
// TODO Await fix for Koin and replace the explicit invocations
// of loadModules() and createRootScope() with a single call to modules()
// (https://github.com/InsertKoinIO/koin/issues/847)
koin.loadModules(listOf(myModule))
koin.createRootScope()
}
Oke, beres!