Назад к вопросам
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
    }
}