首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MVP Koin中注入Activity对象

在MVP Koin中注入Activity对象
EN

Stack Overflow用户
提问于 2018-10-13 05:12:25
回答 2查看 1.7K关注 0票数 2

我正在使用Koin将Activity注入到preseneter,但是Activity的现有实例没有传递给presenter。而是创建一个新的。我遗漏了什么?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-05-05 07:23:25

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

代码语言:javascript
复制
val myModule = module {
    single<IStartupPresenter> { (view: IStartupActivity) ->  StartupPresenter(view) }
}

然后在将其注入到您的活动中:

代码语言:javascript
复制
class StartupActivity : Activity(), IStartupActivity {
    val presenter: IStartupPresenter by inject { parametersOf(this) }

...
}

关于injecting parameters的Koin文档。

票数 3
EN

Stack Overflow用户

发布于 2018-11-16 16:55:14

正如@EpicPandaForce所说,Android系统创建Activity类,您不能只创建/注入它。

如果要从presenter访问activity的界面,您可以使用变量来设置它。在IStartupPresenter中,你可以这样写:

val activity = IStartupActivity?

StartupActivity中,您可以添加:

代码语言:javascript
复制
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
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52787061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档