Sobes.tech
Middle+

Ako injektovať ViewModel pomocou Dagger Hilt?

sobes.tech AI

Odpoveď od AI

S pomocou anotácie @HiltViewModel pre samotný ViewModel a @ActivityRetainedScoped alebo @ViewModelScoped pre závislosti, ktoré majú žiť rovnako dlho ako ViewModel alebo aktivita. Závislosti sú injektované cez konštruktor s anotáciou @Inject.

// Definícia ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injektovanie závislosti cez konštruktor
) : ViewModel() {
    // Logika ViewModel
}
// Vyhlásenie závislosti (Repository)
@ActivityRetainedScoped // Príklad scope
class MyRepository @Inject constructor() {
    // Logika repozitára
}

V Activity alebo Frgmente sa ViewModel získa pomocou delegátu viewModels() alebo activityViewModels():

// V Activity
@AndroidEntryPoint // Anotácia pre Hilt komponenty
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Získanie ViewModel pomocou delegátu

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Použitie viewModel
    }
}
// V Frgmente
@AndroidEntryPoint // Anotácia pre Hilt komponenty
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Získanie ViewModel pre tento fragment
    // alebo
    // private val activityViewModel: MyViewModel by activityViewModels() // Získanie ViewModel via aktivita

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Použitie viewModel
    }
}

Potrebné závislosti (napríklad moduly na poskytovanie MyRepository) by mali byť nakonfigurované v Hilt moduloch.

// Príklad Hilt modulu
@Module
@InstallIn(SingletonComponent::class) // Inštalácia do SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Scope pre singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Poskytovanie inštancie MyRepository
    }
}