Sobes.tech
Middle+

Hoe injecteer je een ViewModel met Dagger Hilt?

sobes.tech AI

Antwoord van AI

Met de annotatie @HiltViewModel voor de ViewModel zelf en @ActivityRetainedScoped of @ViewModelScoped voor afhankelijkheden die zo lang moeten leven als de ViewModel of activiteit. Afhankelijkheden worden geïnjecteerd via de constructor met de annotatie @Inject.

// Definities van ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injectie van afhankelijkheid via constructor
) : ViewModel() {
    // Logica van ViewModel
}
// Declaratie van afhankelijkheid (Repository)
@ActivityRetainedScoped // Voorbeeld scope
class MyRepository @Inject constructor() {
    // Logica van repository
}

In Activity of Fragment wordt de ViewModel verkregen via de delegaat viewModels() of activityViewModels():

// In Activity
@AndroidEntryPoint // Annotatie voor Hilt-componenten
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Verkrijgen van ViewModel via delegaat

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Gebruik van viewModel
    }
}
// In Fragment
@AndroidEntryPoint // Annotatie voor Hilt-componenten
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Verkrijgen van ViewModel voor dit fragment
    // of
    // private val activityViewModel: MyViewModel by activityViewModels() // Verkrijgen van ViewModel gekoppeld aan activiteit

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Gebruik van viewModel
    }
}

Benodigde afhankelijkheden (bijvoorbeeld modules voor het leveren van MyRepository) moeten worden geconfigureerd in Hilt-modules.

// Voorbeeld Hilt-module
@Module
@InstallIn(SingletonComponent::class) // Installatie in SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Scope voor singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Voorziening van een MyRepository instantie
    }
}