簡體   English   中英

Koin Android:注入存儲庫時org.koin.error.NoBeanDefFoundException

[英]Koin Android: org.koin.error.NoBeanDefFoundException when Inject Repository

我用koin for DI用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)
            }
        }
}}

這里的錯誤信息

在此處輸入圖片說明

錯誤消息告訴您Koin無法為您創建LoginViewModel實例,因為它在創建過程中必須提供AppRepository的實例,但是您沒有告訴它如何執行。

我的猜測是您不小心直接在LoginViewModel構造函數中使用了AppRepository類型,而不是使用將存儲庫實例綁定到模塊中的AppDataSource

因此,如果您有類似這樣的內容,則需要專門的AppRepository

class LoginViewModel(val dataSource: AppRepository) : ViewModel()

你應該這樣,當你只是問孝允為更換AppDataSource ,你沒有將其配置為能夠提供:

class LoginViewModel(val dataSource: AppDataSource) : ViewModel()

如果您的ViewModel中有一個接口作為參數。

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

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

singleBy<InterfaceName,InterfaceNameImplementation>()

最后加入您的ViewModel

viewModel { MyViewModel(get()) }

這在Koin 2.0中對我有用

希望能幫助到你 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM