我正在使用Koin将Activity注入到preseneter,但是Activity的现有实例没有传递给presenter。而是创建一个新的。我遗漏了什么?
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发布于 2019-05-05 07:23:25
这可以通过将活动声明为注入的参数来解决,如下所示:
val myModule = module {
single<IStartupPresenter> { (view: IStartupActivity) -> StartupPresenter(view) }
}然后在将其注入到您的活动中:
class StartupActivity : Activity(), IStartupActivity {
val presenter: IStartupPresenter by inject { parametersOf(this) }
...
}关于injecting parameters的Koin文档。
发布于 2018-11-16 16:55:14
正如@EpicPandaForce所说,Android系统创建Activity类,您不能只创建/注入它。
如果要从presenter访问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
}
}https://stackoverflow.com/questions/52787061
复制相似问题