0

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.

1
  • better is 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 Commented Dec 7, 2023 at 8:07

1 Answer 1

0

Order Module and user Module is totally different from each other. In that case, i think Different ViewModel and Different repository would be better. If Same Module need multiple Api call in that case use one ViewModel and one Repository with Function. Function with pass differnet type for Specific Api Call.In your Scenrio, I think Approach 1 will be better.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.