Назад к вопросам
Middle+
93
questionbank
Как заинжектировать ViewModel с помощью Dagger Hilt?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
С помощью аннотации @HiltViewModel для самой ViewModel и @ActivityRetainedScoped или @ViewModelScoped для зависимостей, которые должны жить столько же, сколько ViewModel или активность. Зависимости инжектируются через конструктор с аннотацией @Inject.
// Определение ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository // Инжекция зависимости через конструктор
) : ViewModel() {
// Логика ViewModel
}
// Объявление зависимости (Repository)
@ActivityRetainedScoped // Пример скоупа
class MyRepository @Inject constructor() {
// Логика репозитория
}
В Activity или Fragment, ViewModel получается с помощью делегата viewModels() или activityViewModels():
// В Activity
@AndroidEntryPoint // Аннотация для Hilt-компонентов
class MyActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels() // Получение ViewModel через делегат
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Использование viewModel
}
}
// В Fragment
@AndroidEntryPoint // Аннотация для Hilt-компонентов
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels() // Получение ViewModel для данного фрагмента
// или
// private val activityViewModel: MyViewModel by activityViewModels() // Получение ViewModel, связанной с активностью
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Использование viewModel
}
}
Необходимые зависимости (например, модули для предоставления MyRepository) должны быть настроены в Hilt-модулях.
// Пример Hilt-модуля
@Module
@InstallIn(SingletonComponent::class) // Установка модуля в SingletonComponent
object RepositoryModule {
@Provides
@Singleton // Пример скоупа для синглтона
fun provideMyRepository(): MyRepository {
return MyRepository() // Предоставление экземпляра MyRepository
}
}