Sobes.tech
Middle+

Как да инжектираме ViewModel с помощта на Dagger Hilt?

sobes.tech AI

Отговор от AI

С помощта на анотацията @HiltViewModel за самия ViewModel и @ActivityRetainedScoped или @ViewModelScoped за зависимости, които трябва да живеят толкова дълго, колкото и ViewModel или активността. Dependencies се инжектират чрез конструктор с анотация @Inject.

// Определяне на ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Инжектиране на зависимост чрез конструктор
) : ViewModel() {
    // Логика на ViewModel
}
// Обявяване на зависимост (Repository)
@ActivityRetainedScoped // Примерен scope
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 // Scope за сингълтон
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Предоставяне на екземпляр на MyRepository
    }
}