Инъекционный объект Activity в MVP Koin - PullRequest
0 голосов
/ 13 октября 2018

Я использую 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

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

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

Это можно решить, объявив активность как параметр для вашей инъекции следующим образом:

val myModule = module {
    single<IStartupPresenter> { (view: IStartupActivity) ->  StartupPresenter(view) }
}

затем введите его в вашу деятельность:

class StartupActivity : Activity(), IStartupActivity {
    val presenter: IStartupPresenter by inject { parametersOf(this) }

...
}
0 голосов
/ 16 ноября 2018

Как заявляет @EpicPandaForce, система Android создает классы Activity, и вы не можете просто создать / внедрить ее.

Если вы хотите получить доступ к интерфейсу вашей деятельности из Presenter, вы можете использовать переменную для его установки.,В 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
    }
}
...