Инъекционный объект 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
    }
}
Другие вопросы по тегам