首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin构造函数中的Koin注入

Kotlin构造函数中的Koin注入
EN

Stack Overflow用户
提问于 2019-04-06 19:04:09
回答 1查看 3.2K关注 0票数 3

我不能通过Koin从构造函数调用inject。

如果我使用“. by inject()”注入DataRepository类,那么所有这些都能很好地工作。但是我想在类的构造函数中提供inject。

在"repo.addPayment(payment)“行中的CounterPresenter类中有一个崩溃。向下看这一页。

代码语言:javascript
复制
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964) 
 Caused by: org.koin.error.NoBeanDefFoundException: No compatible definition found. Check your module definition

这是我的结构:

Koin DI,我怎样才能改变这个模块才能成功地工作?

代码语言:javascript
复制
val repositoryModule = module {
    single { PrefsManager() }
    single<IRepository> { DataRepository(get() as LocalRepository) }
    single<ILocalRepository> { LocalRepository(get()) }
}

val databaseModule = module {
    single {
        Room.databaseBuilder(androidApplication(), AppDatabase::class.java, Enviroment.DATABASE_NAME).build()
    }
    single { get<AppDatabase>().getCounterDao() }
}

val presentersModule = module {
    factory { CounterPresenter() }
    factory { SplashPresenter() }
}

类DataRepository

代码语言:javascript
复制
class DataRepository(private val localRepository: ILocalRepository) : IRepository {

    init {  Log.d("ROMAN", "init DataRepository") }

    override suspend fun addPayment(payment: Int) {
        localRepository.addPayment(payment)
    }
}

类LocalRepository

代码语言:javascript
复制
class LocalRepository(private val counterDao: CounterDao) : ILocalRepository {

    override suspend fun addPayment(payment: Int) = runBlocking {
        counterDao.insertPayment(Payment(payment))
    }
}

类CounterPresenter

代码语言:javascript
复制
class CounterPresenter : BasePresenter<CounterContract.View>(), CounterContract.Presenter {
    private val repo: DataRepository by inject()


    override fun onViewCreated() {
        super.onViewCreated()
        launchIO { repo.addPayment(payment) }
    }
EN

回答 1

Stack Overflow用户

发布于 2019-04-18 05:49:51

若要向任何类注入依赖项,该类必须实现KoinComponent接口。(活动和片段除外)

如果这样做,那么您的代码就会正常工作:

代码语言:javascript
复制
class CounterPresenter : BasePresenter<CounterContract.View>(), CounterContract.Presenter, KoinComponent {
    private val repo: DataRepository by inject()


    override fun onViewCreated() {
        super.onViewCreated()
        launchIO { repo.addPayment(payment) }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55552501

复制
相关文章

相似问题

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