Say in the OrderScreen, we have OrderViewModel(orderRepository) and UserViewModel(userRepository).
Approach #1:
class OrderViewModel(private val orderRepository: OrderRepository) : ViewModel() {
fun doSomething() = viewModelScope.launch {
orderRepository.doSomething()
}
}
class UserViewModel(private val userRepository: UserRepository): ViewModel() {
fun doSomething() = viewModelScope.launch {
userRepository.doSomething()
}
}
@Composable
fun OrderScreen(
orderViewModel: OrderViewModel = viewModel(),
userViewModel: UserViewModel = viewModel()
) {
someButton.setOnclickListener {
orderViewModel.doSomething() //<<- may have multithreading issue?
userViewModel.doSomething()
}
}
Approach #2:
class OrderViewModel(
private val orderRepository: OrderRepository,
private val userRepository: UserRepository
) : ViewModel() {
fun doSomething() = viewModelScope.launch {
orderRepository.doSomething()
userRepository.doSomething()
}
}
@Composable
fun OrderScreen(orderViewModel: OrderViewModel = viewModel()) {
someButton.setOnclickListener {
orderViewModel.doSomething()
}
}
Which one is better and why? Thanks.
betteris quite broad, people might vote to close your question because of it, perhaps worthwhile adding in what you're looking for specifically. also, to avoid having a "god" viewmodel, you can consider adding usecases instead, that way you can have 1 viewmodel but reuse the logic for the repo's in several VM's