"Kotlin 1.8.20 bug"? The Android version of my mul...
# getting-started
m
"Kotlin 1.8.20 bug"? The Android version of my multiplatform app is crashing on startup, I think since I updated Kotlin. The problem seems to be that I'm trying to cast the system supplied "application for this activity" object to my custom app object (which extends Application() ). Apparently this is illegal at the Java level. However, it's been running just fine for me for... ever! So I have two questions; 1) did previous versions of Kotlin make this ok (since it's always worked for me before), and 2) how do I now obtain my custom app object?
p
You capture the exception/crash stacktrace, could you post a piece of code too
m
The stack trace in logcat is FATAL EXCEPTION: main
Process: <http://uk.co|uk.co>.goodunlimited.mobilemanege, PID: 9976
java.lang.RuntimeException: Unable to start activity ComponentInfo{<http://uk.co|uk.co>.goodunlimited.mobilemanege/uk.co.goodunlimited.mobilemanege.screens.main.MainScreen}: java.lang.ClassCastException: android.app.Application cannot be cast to <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseApplication at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3773) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3913)	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2436) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8180) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:946)                                                                                                    Caused by: java.lang.ClassCastException: android.app.Application cannot be cast to <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseApplication at <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseActivity$activityCompositionRoot$2.invoke(BaseActivity.kt:13) at <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseActivity$activityCompositionRoot$2.invoke(BaseActivity.kt:12) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseActivity.getActivityCompositionRoot(BaseAct at <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseActivity$compositionRootController$2.invoke(BaseActivity.kt:17) at <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseActivity$compositionRootController$2.invoke(BaseActivity.kt:16) at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74) at <http://uk.co|uk.co>.goodunlimited.mobilemanege.common.base.BaseActivity.getCompositionRootController(BaseActivity.kt:16) at <http://uk.co|uk.co>.goodunlimited.mobilemanege.screens.main.MainScreen.onCreate(MainScreen.kt:43) at android.app.Activity.performCreate(Activity.java:8595) at android.app.Activity.performCreate(Activity.java:8573) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1455) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3913) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:139) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2436) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:205) at android.os.Looper.loop(Looper.java:294) at android.app.ActivityThread.main(ActivityThread.java:8180) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:946)
The code where it's happening is
Copy code
@ExperimentalMultiplatform
open class BaseActivity : AppCompatActivity() {
    val activityCompositionRoot: ActivityCompositionRoot by lazy {
        ActivityCompositionRoot((application as BaseApplication).compositionRoot, this)
    }
    val compositionRootController: CompositionRootController by lazy {
        CompositionRootController(activityCompositionRoot)
    }
}
it's complaining about the "application as BaseApplication" part. "application" is the non-method version of
Copy code
public final android.app.Application getApplication()
and my application object is
Copy code
open class BaseApplication : Application() {

    lateinit var compositionRoot: CompositionRoot

    override fun onCreate() {
        super.onCreate()
        compositionRoot = CompositionRoot()
    }
}
p
And the manifest declares the application as your class Application right, nothing changed in the manifest
m
😱 I've changed the manifest around a lot because of this issue. It used to have that and I removed it. I'm not sure if that was in response to this issue. Replacing it, it works! But why, if it's not allowed? And, thank you.
👍 1