Как заинжектить что-то в конструктор Viewmodel

«Как заинжектить что-то в конструктор Viewmodel» — вопрос из категории DI, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для инъекции зависимостей в ViewModel используйте ViewModelProvider.Factory. В Android рекомендуется использовать Hilt для упрощения DI. Пример с Hilt:

@HiltViewModel
class MyViewModel @Inject constructor(
    private val repository: MyRepository
) : ViewModel() {
    //...
}

Без Hilt:

class MyViewModelFactory(
    private val repository: MyRepository
) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return MyViewModel(repository) as T
    }
}

// В Activity/Fragment:
val factory = MyViewModelFactory(repository)
val viewModel = ViewModelProvider(this, factory)[MyViewModel::class.java]

Ключевые моменты:

  • ViewModel не должна получать контекст напрямую
  • Для Hilt достаточно аннотации @HiltViewModel
  • Без Hilt нужно реализовать Factory