#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']
Спасибо