[Koin]: При передаче интерфейса конструктора в модели представления Всегда появляется сообщение «Не удалось создать экземпляр» с помощью Koin

#android #kotlin #koin

Вопрос:

я использую библиотеку koin версии «2.2.3», всегда получаю сообщение об ошибке :

 org.koin.core.error.InstanceCreationException: Could not create instance for [Single:'com.apptest.domain.usecase.IMyUseCase']
 

Я следил за учебником по https://insert-koin.io/docs/quickstart/android-viewmodel

но параметр интерфейса в модели представления конструктора (TestViewModel.kt) не может создать экземпляр с помощью koin.

это мой установочный код build.gradle :

 implementation "io.insert-koin:koin-core:$koin_version"
implementation "io.insert-koin:koin-android:$koin_version"
implementation "io.insert-koin:koin-androidx-scope:$koin_version"
implementation "io.insert-koin:koin-androidx-viewmodel:$koin_version"
 

Версия :
ext.koin_version = «2.2.3»

файл : TestFragment.kt

 import org.koin.androidx.viewmodel.ext.android.viewModel

class TestFragment : Fragment() {
    private val testViewModel: TestViewModel by viewModel()
    private var _binding: FragmentTestBinding? = null

    private val binding get() = _binding!!

    override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {

        _binding = FragmentTestBinding.inflate(inflater, container, false)
 
        return binding.root
    }



    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        

        testViewModel.getHomeData(limit,page)
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
 

файл : TestViewModel.kt

 class TestViewModel(private val useCase: IMyUseCase) : ViewModel() {

    val homeData: MutableLiveData<Resource<List<Home>>> = MutableLiveData()

    fun getHomeData(limit:Int, page:Int, symbol:String = "USD"){
        GlobalScope.launch {
            useCase.getHomeData(limit,page,symbol).collect {
                homeData.postValue(it)
            }
        }
    }
}
 

file : MyUseCaseImpl.kt

 class MyUseCaseImpl constructor(private val repository: IMyRepository) : IMyUseCase {
    override fun getHomeData(limit: Int, page: Int, symbol: String): Flow<Resource<List<Home>>> =
        repository.getHomeData(limit, page, symbol)
}
 

file : IMyUseCase.kt

 interface IMyUseCase {
    fun getHomeData(limit: Int, page: Int, symbol: String): Flow<Resource<List<Home>>>
}
 

file : MyRepositoryImpl.kt

 class MyRepositoryImpl constructor(
    private val remoteDataSource: RemoteDataSource,
    private val localDataSource: LocalDataSource,
    private val appExecutors: AppExecutors
) : IMyRepository {
    override fun getHomeData(limit: Int, page: Int, symbol: String): Flow<Resource<List<Home>>> {
   ... Code
}
 

file : IMyRepository.kt

 import com.apptest.domain.model.Home
import kotlinx.coroutines.flow.Flow
interface IMyRepository {
    fun getHomeData(limit:Int, page:Int, symbol:String): Flow<Resource<List<Home>>>
}
 

file : AppModule.kt

 import com.apptest.data.MyRepositoryImpl
import com.apptest.data.local.LocalDataSource
import com.apptest.data.remote.RemoteDataSource
import com.apptest.domain.repository.IMyRepository
import com.apptest.domain.usecase.IMyUseCase
import com.apptest.domain.usecase.MyUseCaseImpl
import com.apptest.ui.watchlist.TestViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

val AppModule = module {
    single { LocalDataSource(get()) }
    single { RemoteDataSource(get()) }
    single<IMyRepository> { MyRepositoryImpl(get(),get(),get()) }
    single<IMyUseCase> { MyUseCaseImpl(get()) }
    viewModel { TestViewModel(get()) }
}
 

File : App.kt

 import android.app.Application
import com.apptest.di.*
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import org.koin.core.logger.Level

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidLogger(Level.DEBUG)
            androidContext(this@App)
            modules(AppModule)
        }
    }
 }
 

не могли бы вы помочь мне, пожалуйста … в этом вопросе. все та же ошибка :

 org.koin.core.error.InstanceCreationException: Could not create instance for [Single:'com.apptest.domain.usecase.IMyUseCase']
 

Спасибо