#android #kotlin #dependency-injection #viewmodel #koin
#Android #kotlin #внедрение зависимостей #viewmodel #koin
Вопрос:
Я пытаюсь внедрить нижеприведенную ViewModel в свой фрагмент, используя koin.
package com.example.koinapplication.ui.main
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.koinapplication.models.Dog
import com.example.koinapplication.repo.DataRepo
import com.example.koinapplication.repo.DataSource
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
import org.koin.java.KoinJavaComponent.inject
class MainViewModel : ViewModel() {
private val dataRepo by inject(DataSource::class.java)
private var limit = 10
private val _dogListLiveData = MutableLiveData<List<Dog>>()
private var dogList = mutableListOf<Dog>()
val dogListLiveData: MutableLiveData<List<Dog>>
get() = _dogListLiveData
fun searchByBreed(queryText: String) {
dataRepo.searchByBreed(
queryText,
object : DataSource.OnResponseCallback<List<Dog>, String> {
override fun onSuccess(obj: List<Dog>?) {
dogList = mutableListOf()
if (!obj.isNullOrEmpty()) {
dogList.addAll(obj)
dogListLiveData.value = dogList.take(limit)
}
}
override fun onError(error: String) {
Log.i("Calling Network Service", error)
}
})
}
fun loadPaginateBreed(): Boolean {
return if ((limit 10) < dogList.size) {
limit = 10
Log.i("Pagination new Limit", limit.toString())
dogListLiveData.value = dogList.take(limit)
false
} else {
limit = dogList.size % limit
dogListLiveData.value = dogList.take(limit)
true
}
}
}
это мои модули
@OptIn(KoinApiExtension::class)
val networkModule = module{
factory { AuthInterceptor() }
factory { provideOkHttpClient(get()) }
factory { GranularErrorCallAdapterFactory<Any>() }
single { providesNetworkClient(get(), get()) }
single<DataSource> { DataRepo(get()) }
single <DataSource> { NetworkRepo(get()) }
}
@OptIn(KoinApiExtension::class)
val viewModelModule = module(override = true) {
viewModel { MainViewModel() }
}
и это мой код внедрения в мой фрагмент и активность
private val myViewModel by sharedViewModel<MainViewModel>()
но это дает мне следующую ошибку
java.lang.NoSuchMethodError: No virtual method getRootScope()Lorg/koin/core/scope/ScopeDefinition; in class Lorg/koin/core/module/Module; or its super classes (declaration of 'org.koin.core.module.Module' appears in /data/app/com.example.koinapplication-0KW8HWC7rkVfXIFPydc82A==/base.apk)
at com.example.koinapplication.repo.RetrofitServiceKt$viewModelModule$1.invoke(RetrofitService.kt:64)
at com.example.koinapplication.repo.RetrofitServiceKt$viewModelModule$1.invoke(Unknown Source:2)
at org.koin.dsl.ModuleKt.module(Module.kt:31)
at org.koin.dsl.ModuleKt.module$default(Module.kt:29)
at com.example.koinapplication.repo.RetrofitServiceKt.<clinit>(RetrofitService.kt:28)
at com.example.koinapplication.repo.RetrofitServiceKt.getNetworkModule(RetrofitService.kt:17)
at com.example.koinapplication.KoinApplication$onCreate$1.invoke(KoinApplication.kt:15)
at com.example.koinapplication.KoinApplication$onCreate$1.invoke(KoinApplication.kt:9)
at org.koin.core.context.GlobalContext.startKoin$koin_core(GlobalContext.kt:68)
at org.koin.core.context.GlobalContextExtKt.startKoin(GlobalContextExt.kt:32)
at org.koin.core.context.GlobalContextExtKt.startKoin$default(GlobalContextExt.kt:31)
at com.example.koinapplication.KoinApplication.onCreate(KoinApplication.kt:12)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1182)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6460)
at android.app.ActivityThread.access$1300(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.L..
В онлайн-руководстве говорится, что просто объявите module и введите, но этого не происходит
, как мне обойти это?
Любая помощь будет высоко оценена
Комментарии:
1.
import
Для чего тыsharedViewModel()
нужен?2.
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
3. где вы устанавливаете koin? Какой код у вас там есть
4. просто это, startKoin { printLogger() androidContext(this@KoinApplication) модули(список(NetworkModule, viewModelModule)) }