3

I am new to Android and I am trying to create an app with Dagger2 and MVVM pattern and kotlin, but I cannot make it run.

My application class code.

class PruebaDaggerApp: Application(), HasActivityInjector, HasSupportFragmentInjector {

@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>

@Inject
lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>

override fun onCreate() {
    super.onCreate()
    DaggerAppComponent.builder().build().inject(this)

}


override fun activityInjector(): AndroidInjector<Activity> = activityInjector

override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentInjector

}

My AppComponent.

@Singleton
@Component(modules = [AndroidSupportInjectionModule::class, AppModule::class, ActivityModule::class])
interface AppComponent {

     fun inject(app: Application)

}

ActivityModule code

@Module
abstract class ActivityModule {
@ContributesAndroidInjector(modules = [FragmentModule::class])
    abstract fun contributesMainActivity(): MainActivity
}

FragmentsModule code

@Module
abstract class FragmentModule {

   @ContributesAndroidInjector
   abstract fun contributesCardFrament(): CardFragment

}

AppModule code

@Module(includes = [ViewModelModule::class])
class AppModule(val app: PruebaDaggerApp) {

@Provides
@Singleton
fun provideApplicationContext(): Context = app.applicationContext

 }

ViewModelModule

@Module
abstract class ViewModelModule {

    @Binds
    abstract fun bindViewModelFactory(viewModelFactory: DaggerViewModelFactory): ViewModelProvider.Factory

    @Binds
    @IntoMap
    @ViewModelKey(CardViewModel::class)
    abstract fun bindCardViewModel(viewModel: CardViewModel): ViewModel


    }

Caused by: kotlin.UninitializedPropertyAccessException: lateinit property activityInjector has not been initialized at org.ottochamo.pruebadagger.PruebaDaggerApp.activityInjector(PruebaDaggerApp.kt:28) at dagger.android.AndroidInjection.inject(AndroidInjection.java:56) at dagger.android.support.DaggerAppCompatActivity.onCreate(DaggerAppCompatActivity.java:43) at org.ottochamo.pruebadagger.MainActivity.onCreate(MainActivity.kt:14) at android.app.Activity.performCreate(Activity.java:6980) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2828)

I've been following a lot of articles yet I cannot make it work. I would appreciate your help a lot

Otto Cheley
  • 552
  • 9
  • 20

2 Answers2

1

You are doing:

    DaggerAppComponent.builder().build().inject(this)

but you do not provide appContext for AppModule which is required in constructor:

class AppModule(val app: PruebaDaggerApp) {}

So you should create your AppComponent like:

    DaggerAppComponent.builder().appModule(AppModule(this)).build().inject(this)

Nimdokai
  • 787
  • 1
  • 6
  • 18
0

My problem was that I requested injection Application instead of my class PruebaDaggerApp and that fix it :)

Otto Cheley
  • 552
  • 9
  • 20