Как внедрить ViewModel во фрагмент?

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