#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. Нет стека, но он компилируется