Manar Hidayat
Manar Hidayat

Reputation: 83

lateinit property ViewModelFactory has not been initialized

I'm using dagger 2.25.2 and androidx.lifecycle for dependency injection in my android project. But I've got error ViewModelFactory has not been initialized

Here is my code's

class PropertyActivity : AppCompatActivity() {

    @Inject
    lateinit var propertyViewModelFactory: PropertyViewModelFactory
    lateinit var propertyViewModel: PropertyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.property_activity)

        propertyViewModel = ViewModelProviders.of(this, propertyViewModelFactory).get(
        PropertyViewModel::class.java)

        propertyViewModel.loadProperties()
}

ViewModelFactory:

class PropertyViewModelFactory @Inject constructor(
    private val propertyViewModel: PropertyViewModel) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(PropertyViewModel::class.java!!)) {
            return propertyViewModel as T
        }
        throw IllegalArgumentException("Unknown class name")
    }
}

AppModule:

@Module
class AppModule(val app: Application){

    @Provides
    @Singleton
    fun provideApplication(): Application = app

    @Provides
    @Singleton
    fun providePropertyViewModelFactory(factory: PropertyViewModelFactory): ViewModelProvider.Factory = factory

}

BuildersModule:

@Module
abstract class BuildersModule {

    @ContributesAndroidInjector
    abstract fun contributePropertyActivity(): PropertyActivity
}

AppComponent:

@Singleton
@Component(modules = arrayOf(AndroidInjectionModule::class,BuildersModule::class, AppModule::class))interface PlotComponent {

    fun inject(app: Application)
}

Application Class :

class PlotApplication : Application(), HasAndroidInjector {
    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Any>

    override fun onCreate() {
        super.onCreate()

        DaggerPlotComponent.builder()
            .appModule(AppModule(this))
            .build().inject(this)
    }
    override fun androidInjector(): AndroidInjector<Any> = activityInjector
}

Upvotes: 1

Views: 3657

Answers (1)

Peter Staranchuk
Peter Staranchuk

Reputation: 1393

I doesn't see where you inject dependency in your activity. The problem may be in this.

Add

AndroidInjection.inject(this)

in your onCreate

Upvotes: 3

Related Questions