3

I am facing this crash only on Kitkat device. My logcat is below. Crashed at getViewModel

Fatal Exception: java.lang.NoClassDefFoundError: kotlin.jvm.internal.Intrinsics
       at com.transferhome.di.AppModule.provideViewModelFactories(AppModule.kt)
       at com.transferhome.di.AppModule_ProvideViewModelFactoriesFactory.provideViewModelFactories(AppModule_ProvideViewModelFactoriesFactory.java:34)
       at com.transferhome.di.DaggerAppComponent.getViewModelProviderFactory(DaggerAppComponent.java:281)
       at com.transferhome.di.DaggerAppComponent.access$3500(DaggerAppComponent.java:124)
       at com.transferhome.di.DaggerAppComponent$SplashActivitySubcomponentImpl.injectSplashActivity(DaggerAppComponent.java:920)
       at com.transferhome.di.DaggerAppComponent$SplashActivitySubcomponentImpl.inject(DaggerAppComponent.java:916)
       at com.transferhome.di.DaggerAppComponent$SplashActivitySubcomponentImpl.inject(DaggerAppComponent.java:909)
       at dagger.android.DispatchingAndroidInjector.maybeInject(DispatchingAndroidInjector.java:113)
       at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:134)
       at dagger.android.AndroidInjection.inject(AndroidInjection.java:63)
       at dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:41)
       at com.transferhome.commons.BaseActivity.onCreate(BaseActivity.kt:41)
       at com.transferhome.splash.SplashActivity.onCreate(SplashActivity.kt:38)

where Splash

class SplashActivity : BaseActivity() {

    private lateinit var viewModel: SplashViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = getViewModel()

        viewModel.onMoveToNext.listen(this) {
            Handler().postDelayed({
                openActivityAndClearTask(it)
            }, 2000)
        }
    }
}

BaseActivity.kt

abstract class BaseActivity : DaggerAppCompatActivity() {

    @Inject
    lateinit var factories: ViewModelProvider.Factory

    inline fun <reified T : ViewModel> getViewModel(): T {
        return ViewModelProviders.of(this, factories)[T::class.java]
    }
}

where AppModule.kt

@Module
class AppModule {

    @Provides
    fun provideViewModelFactories(viewModels: Map<Class<out ViewModel>,
            @JvmSuppressWildcards Provider<ViewModel>>):
            ViewModelProvider.Factory {
        return object : ViewModelProvider.Factory {
            override fun <T : ViewModel?> create(modelClass: Class<T>): T {
                val factory = viewModels[modelClass]?.get() ?: error(
                    "No factory provided against ${modelClass.name}"
                )
                @Suppress("UNCHECKED_CAST")
                return factory as T
            }
        }

    }
}

EDIT

class App : DaggerApplication() {

    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
        return DaggerAppComponent.builder().addContext(this).build()
    }

    override fun onCreate() {
        super.onCreate()
        MultiDex.install(this)
    }
}
Zar E Ahmer
  • 33,936
  • 20
  • 234
  • 300

2 Answers2

2

If this happens only on Kitkat, then it's probably a multi-dexing issue.

You should do the following:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

in AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="com.acme.myapp.CustomApplication" >
        ...
    </application>
</manifest>

And in CustomApplication:

public class CustomApplication extends Application {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}
EpicPandaForce
  • 79,669
  • 27
  • 256
  • 428
  • I have added my Application class . See EDIT section in Question. I have to extend it with Dagger – Zar E Ahmer Oct 15 '19 at 14:11
  • 1
    @XarEAhmer you need to move `MultiDex.install(this)` into `attachBaseContext` instead of calling it after `super.onCreate()`. Theoretically it would also work if you call `MultiDex.install(this)` ***before*** `super.onCreate()`. – EpicPandaForce Oct 15 '19 at 14:44
0

Make sure that you've configured Kotlin in Android project in a right way:

  1. kotlin-android Gradle plugin is added to the build:

    plugins {
        id("com.android.application")
        kotlin("android") // This one is important
        ...
    }
    
  2. Standard library dependency is included:

    dependencies {
        ...
        implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
        ...
    }
    

Take a look at a sample project in this repo.

madhead
  • 31,729
  • 16
  • 153
  • 201