Презентатор не внедряется в мою активность в Dagger 2

#android #kotlin #dagger-2

#Android #kotlin #dagger-2

Вопрос:

Я изучаю Dagger 2 для создания проекта с чистой архитектурой. Я просматривал некоторые вопросы SO об одной и той же ошибке, но все еще не могу понять, почему это не работает.

Я запустил отладчик, чтобы проверить, передается ли моя активность просмотра презентатору, но, похоже, она не вводит презентатора, потому что она не передается презентатору.

Вот моя активность, в которой я внедряю презентатора.

ApodDetail.kt

  @Inject lateinit var presenter : ApodDetailPresenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_apod_detail)
        (application as SimpleMVPApplication).apodComponent.inject(this)
        fetchApodDetails()
        imageview_apoddetail_reloadDetail.bringToFront()
    }
  

PresenterModule.kt

 @Module
class PresenterModule {

    @Provides
    @Singleton
    fun provideApodDetailPresenter(): ApodDetailPresenter {
        return ApodDetailPresenter(ApodDetailsInteractorImpl(), ImageCacheImpl())
    }

}
  

AppComponent.kt

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

    fun inject(target: ApodDetail)
}
  

AppModule.kt

 @Module
class AppModule(private val app: Application) {

    @Provides
    @Singleton
    fun provideContext(): Context = app
}
  

SimpleMVPApplication.kt

 class SimpleMVPApplication: Application() {

    lateinit var apodComponent: AppComponent

    override fun onCreate() {
        super.onCreate()
        apodComponent = initDagger(this)
    }

    private fun initDagger(app: SimpleMVPApplication): AppComponent =
            DaggerAppComponent.builder()
                    .appModule(AppModule(app))
                    .build()
}
  

И это презентатор, который я пытаюсь внедрить в ApodDetail.kt

ApodDetailPresenter.kt

 class ApodDetailPresenter @Inject constructor(apodInteractor: ApodDetailsInteractorImpl, cache: ImageCacheImpl): ApodDetailContract.Presenter {

    var view: ApodDetailContract.View? = null
    var apodInteractor: ApodDetailsInteractorImpl? = null
    var cache: ImageCacheImpl? = null

    init {
        this.view = view
        this.apodInteractor = apodInteractor
        this.cache = cache
    }
  

Как я уже говорил выше, он не внедряет presenter в мою активность.

Комментарии:

1. Почему вы зависите от impl s?

2. В некоторых репозиториях я видел, что я должен зависеть от интерфейсов, это правильный способ сделать это? Я в зависимости от реализации бизнес-логики, потому что я создавал экземпляр своего presenter с этим классом, прежде чем работать с

3. Вы должны перейти @Singleton из модуля Presenter в @Inject constructor ‘d presenter, затем полностью удалить PresenterModule.

Ответ №1:

В вашем классе приложения отсутствует вызов для добавления модуля presenter в конструкторе компонентов. Вам нужно:

 private fun initDagger(app: SimpleMVPApplication): AppComponent =
            DaggerAppComponent.builder()
                    .appModule(AppModule(app))
                    .presenterModule(PresenterModule())
                    .build()
  

Комментарии:

1. Существует ли трассировка стека, связанная с невозможностью внедрения? Или он не компилируется?

2. Нет стека, но он компилируется