Junior — Middle
How to implement dependency injection through context inside a ViewModel?
sobes.tech AI
Answer from AI
In Android, ViewModel is usually not recommended to directly store or use Context to avoid memory leaks. However, if you need to pass dependencies through the context, you can use the following approaches:
- Passing Application Context: Inherit from AndroidViewModel, which provides access to the Application Context.
class MyViewModel(application: Application) : AndroidViewModel(application) {
private val context = getApplication<Application>().applicationContext
// Use context to access resources or system services
}
- Using Dependency Injection: Pass necessary dependencies to the ViewModel constructor via a factory.
class MyViewModel(private val repository: MyRepository) : ViewModel() {
// ViewModel logic
}
class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
return MyViewModel(repository) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}
Thus, the context is used carefully, and dependencies are passed explicitly, which improves testability and prevents memory leaks.