[Koin]: Passing Contructor Interface in View Model Always Get Message "Could not create instance" with Koin

Viewed 194

i'm Using libary koin version "2.2.3" always get error message :

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

I've followed the tutorial at https://insert-koin.io/docs/quickstart/android-viewmodel

but interface parameter in constructor view model (TestViewModel.kt) can't create instance with koin.

this is my setup code 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"

Version : ext.koin_version = "2.2.3"

file : 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
    }
}

file : 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)
        }
    }
 }

can you help me please.. this issue. still same error :

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

thanks

0 Answers
Related