![](/img/trans.png)
[英]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.