首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Koin :注入库时的org.koin.error.NoBeanDefFoundException

Koin :注入库时的org.koin.error.NoBeanDefFoundException
EN

Stack Overflow用户
提问于 2019-07-15 02:53:01
回答 2查看 2K关注 0票数 0

我用mvvm模式为DI创建了带有koin的项目,但我始终没有找到定义存储库

在查看模型之前,我已经在模块应用程序中定义了存储库,但是我得到了一些错误。

分级应用程序

代码语言:javascript
复制
// Koin for Android
implementation "org.koin:koin-android:$rootProject.koin_version"
// Koin Android Scope features
implementation "org.koin:koin-androidx-scope:$rootProject.koin_version"
// Koin Android ViewModel features
implementation "org.koin:koin-androidx-viewmodel:$rootProject.koin_version"

模块

代码语言:javascript
复制
val dataModule = module {
//remoteData
single { AppRemoteData() }

//repository
single{ AppRepository(get()) as AppDataSource}

// viewmodel
viewModel{ ListHomeViewModel(get()) }
viewModel { LoginViewModel(get()) }

定义模块

代码语言:javascript
复制
val myAppModule = listOf(appModule, dataModule)

在app

代码语言:javascript
复制
startKoin {
        androidLogger(Level.DEBUG)
        androidContext(this@MainApp)
        modules(myAppModule)
    }

存储库类

代码语言:javascript
复制
class AppRepository(val appRemoteDataSource: AppRemoteData) : AppDataSource {

override fun loginAccount(email: String, password: String) : LiveData<String> {
    val data = MutableLiveData<String>()
        appRemoteDataSource.loginAccount(email,password,object : AppDataSource.LoginCallback{
            override fun onSucces(id: String?) {
                //berhasil
                data.postValue(id)
            }

            override fun onFailed(message: String?) {
                data.postValue(message)
                d(message)
            }

            override fun onFailure(message: String?) {
                data.postValue(message)
                d(message)
            }

        })
    return  data
}

AppRemoteData

代码语言:javascript
复制
class  AppRemoteData  {
val ref = FirebaseDatabase.getInstance().getReference("user")
var auth = FirebaseAuth.getInstance()

 fun loginAccount(email: String, password: String, callback: AppDataSource.LoginCallback) {
    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener {
            task ->
            if(task.isComplete){
                callback.onSucces(task.result?.user?.providerId)
            }else{
                callback.onFailed(task.exception?.localizedMessage)
            }
        }
}}

这里的错误信息

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-22 12:30:21

如果在您的ViewModel中有一个接口作为参数。

代码语言:javascript
复制
class MyViewModel(val interfaceName: InterfaceName) : ViewModel()

在您的模块定义中,使用singleBy<>而不是Single()。

代码语言:javascript
复制
singleBy<InterfaceName,InterfaceNameImplementation>()

终于得到了你的ViewModel

代码语言:javascript
复制
viewModel { MyViewModel(get()) }

这在Koin 2.0中对我起了作用

希望它有帮助:)

票数 1
EN

Stack Overflow用户

发布于 2019-07-15 04:34:04

错误消息告诉您,Koin无法为您创建一个LoginViewModel实例,因为它在创建AppRepository时必须提供一个实例,但您没有告诉它如何这样做。

我的猜测是,您不小心在AppRepository构造函数中直接使用了LoginViewModel类型,而不是使用将存储库实例绑定到模块中的AppDataSource

因此,如果您有这样的东西,这需要一个AppRepository,特别是:

代码语言:javascript
复制
class LoginViewModel(val dataSource: AppRepository) : ViewModel()

您应该将其替换为以下内容,您只需要向Koin请求一个AppDataSource,而您确实将其配置为能够提供:

代码语言:javascript
复制
class LoginViewModel(val dataSource: AppDataSource) : ViewModel()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57032744

复制
相关文章

相似问题

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