2

我正在使用 Koin 将 Activity 注入演示者,但现有的 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
4

2 回答 2

3

我知道这个问题已经被问过一段时间了,但这里是那些最终来到这里的人的解决方案。

这可以通过将活动声明为注入的参数来解决,如下所示:

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

然后将其注入您的活动:

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

...
}

Koin 关于注入参数的文档。

于 2019-05-04T23:23:25.177 回答
1

正如@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
    }
}
于 2018-11-16T08:55:13.697 回答