Инъекционный объект Activity в MVP Koin
Я использую Koin для внедрения Activity в preseneter, но существующий экземпляр Activity не передается докладчику. Новый создается вместо. Что мне не хватает?
val mainModule = module {
single<IStartupActivity> { StartupActivity() }
factory<IStartupPresenter> { StartupPresenter(get()) }
}
class StartupPresenter(val view: IStartupActivity): IStartupPresenter {
}
class StartupActivity : Activity(), IStartupActivity {
val presenter: IStartupPresenter by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
I/KOIN: +-- 'inf.ecg.presenter.interfaces.IStartupPresenter'
D/KOIN: |-- [Factory [name='IStartupPresenter',class='inf.ecg.presenter.interfaces.IStartupPresenter']]
I/KOIN: | +-- 'inf.ecg.view.interfaces.IStartupActivity'
D/KOIN: | |-- [Single [name='IStartupActivity',class='inf.ecg.view.interfaces.IStartupActivity']]
D/KOIN: | |-- inf.ecg.view.implementations.StartupActivity@4176160
I/KOIN: | \-- (*) Created
D/KOIN: | !-- [inf.ecg.view.interfaces.IStartupActivity] resolved in 4.378594 ms
D/KOIN: |-- inf.ecg.presenter.implementations.StartupPresenter@ddfe619
I/KOIN: \-- (*) Created
D/KOIN: !-- [inf.ecg.presenter.interfaces.IStartupPresenter] resolved in 18.235835 ms
1 ответ
Я знаю, что этот вопрос задавался некоторое время назад, но вот решение для тех, кто в конечном итоге здесь.
Это можно решить, объявив активность как параметр для вашей инъекции следующим образом:
val myModule = module {
single<IStartupPresenter> { (view: IStartupActivity) -> StartupPresenter(view) }
}
затем добавьте его в свою деятельность:
class StartupActivity : Activity(), IStartupActivity {
val presenter: IStartupPresenter by inject { parametersOf(this) }
...
}
Как заявляет @EpicPandaForce, система Android создает классы Activity, и вы не можете просто создать / внедрить ее.
Если вы хотите получить доступ к интерфейсу вашей деятельности от докладчика, вы можете использовать переменную для его установки. В IStartupPresenter
Вы могли бы написать:
val activity = IStartupActivity?
И в StartupActivity
вы добавляете:
class StartupActivity : Activity(), IStartupActivity {
val presenter: IStartupPresenter by inject()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
presenter.activity = this
}
}