My viewmodel module looks like this:
val viewModelModule = module {
viewModel { (id: Int, user: String, email: String) ->
MyViewModel(get(), get(), id = id, user = user, email = email)
}
}
so the viewmodel accepts a total of five parameters, the first two being repositories, here are modules for both of them:
val firstRepositoryModule = module {
single {
FirstRepository()
}
}
val secondRepositoryModule = module {
single {
SecondRepository()
}
}
i'm aware of this sample code, but here the viewmodel doesn't accept any parameters, so it doesn't answer my question
As mentioned in Koin's docs we can pass parameters to ViewModel via parametersOf() function and we can get ViewModel in composable with getViewModel(parametersOf(...)).
Example of a ViewModel with two params, string with ID of object and repository. In init{} we can use both of them:
class MeaningViewModel(private val meaningID: String, private val dictRepository: DictRepository) : ViewModel() {
init {
viewModelScope.launch {
val reply = dictRepository.getMeaningDetails(meaningID)
...
}
Koin module with repository as a singleton and ViewModel with two parameters:
val appModule = module {
single<DictRepository> { DictRepositoryImpl() }
viewModel { MeaningViewModel(get(), get()) }
...
}
In NavHost's composable:
composable(
route = "meaning/{meaningID}",
arguments = listOf(navArgument("meaningID") { type = NavType.StringType })
) { entry ->
val meaningID = entry.arguments?.getString("meaningID") ?: ""
val viewModel = getViewModel<MeaningViewModel>(
parameters = { parametersOf(meaningID) }
)