android - 在 MVP Koin 中注入 Activity 对象
问题描述
我正在使用 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
解决方案
我知道这个问题已经被问过一段时间了,但这里是那些最终来到这里的人的解决方案。
这可以通过将活动声明为注入的参数来解决,如下所示:
val myModule = module {
single<IStartupPresenter> { (view: IStartupActivity) -> StartupPresenter(view) }
}
然后将其注入您的活动:
class StartupActivity : Activity(), IStartupActivity {
val presenter: IStartupPresenter by inject { parametersOf(this) }
...
}
Koin 关于注入参数的文档。
推荐阅读
- i2c - 8051 MCU I2C 信号无响应
- java - Hibernate/JPA 将本机查询的结果映射到非实体持有实体
- html - HTML Audio 是否进行了一些更新?
- javascript - 无法获取 Request.azureMobile
- dart - 当我选择一个文本字段时,键盘会在它上面移动
- angular - “any[]”类型的参数不能分配给“PollModel”类型的参数。“any[]”类型中缺少属性“pollId”
- user-interface - 如何从滑块控件中读取值?
- android - 将 Android Studio 更新到 3.1.2 后,我收到“无法加载 AppCompat ActionBar 并出现未知错误。”
- perl - 如何修改现有程序中的“for”循环
- cors - 谷歌云存储不会将 CORS 标头添加到 OPTIONS 调用