Sobes.tech
Middle+

Kako injektovati ViewModel pomoću Dagger Hilt?

sobes.tech АИ

Одговор од АИ

Sa anotacijom @HiltViewModel za sam ViewModel i @ActivityRetainedScoped ili @ViewModelScoped za zavisnosti koje treba da žive koliko i ViewModel ili aktivnost. Zavisnosti se injektuju putem konstruktora sa anotacijom @Inject.

// Definisanje ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injekcija zavisnosti putem konstruktora
) : ViewModel() {
    // Logika ViewModel
}
// Deklaracija zavisnosti (Repository)
@ActivityRetainedScoped // Primer scope
class MyRepository @Inject constructor() {
    // Logika repozitorijuma
}

U Activity ili Fragment, ViewModel se dobija pomoću delegata viewModels() ili activityViewModels():

// U Activity
@AndroidEntryPoint // Anotacija za Hilt komponente
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Dobijanje ViewModel putem delegata

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Korišćenje viewModel
    }
}
// U Fragment
@AndroidEntryPoint // Anotacija za Hilt komponente
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Dobijanje ViewModel za ovaj fragment
    // ili
    // private val activityViewModel: MyViewModel by activityViewModels() // Dobijanje ViewModel povezano sa aktivnošću

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Korišćenje viewModel
    }
}

Potrebne zavisnosti (npr. moduli za obezbeđivanje MyRepository) treba da budu konfigurisane u Hilt modulima.

// Primer Hilt modula
@Module
@InstallIn(SingletonComponent::class) // Instalacija u SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Scope za singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Obezbeđivanje instance MyRepository
    }
}