Koin Android:注入存储库时org.koin.error.NoBeanDefFoundException

时间:2019-07-15 02:53:01

标签: android kotlin mvvm koin

我用带有koin的mvvm模式制作项目,但我始终找不到定义库

我在viewmodel之前先在模块应用中定义存储库,但出现一些错误

Gradle应用

// 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"

模块

val dataModule = module {
//remoteData
single { AppRemoteData() }

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

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

定义模块

val myAppModule = listOf(appModule, dataModule)

在应用中

startKoin {
        androidLogger(Level.DEBUG)
        androidContext(this@MainApp)
        modules(myAppModule)
    }

存储库类

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

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)
            }
        }
}}

此处错误消息

enter image description here

2 个答案:

答案 0 :(得分:1)

错误消息告诉您Koin无法为您创建 -- Production Code args={ "owner":"EB", "start_date":datetime.datetime(2019, 7, 9), 'retries': 3, 'retry_delay': timedelta(minutes=1),} dag = DAG( dag_id='**_scoring_prod', default_args=args, schedule_interval='15 15 * * 0', catchup=False, dagrun_timeout=timedelta(minutes=60) ) 实例,因为它在创建过程中不得不提供LoginViewModel的实例,但是您没有告诉它怎么做。

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

因此,如果您有类似这样的内容,则需要专门使用AppDataSource

AppRepository

您应该用它代替它,在这里您只要求Koin提供一个class LoginViewModel(val dataSource: AppRepository) : ViewModel() ,您已经对其进行了配置以使其能够提供:

AppDataSource

答案 1 :(得分:0)

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

class WalletViewModel(val interfaceName: InterfaceName) : ViewModel()

在模块定义中,使用 singleBy <> 代替Single()。

singleBy<InterfaceName,InterfaceNameImplementation>()

最后加入您的ViewModel

viewModel { MyViewModel(get()) }

这在Koin 2.0中对我有用

希望它会有所帮助:)