Sobes.tech
Middle+

Comment injecter un ViewModel avec Dagger Hilt?

sobes.tech IA

Réponse de l'IA

Avec l'annotation @HiltViewModel pour le ViewModel lui-même et @ActivityRetainedScoped ou @ViewModelScoped pour les dépendances qui doivent vivre aussi longtemps que le ViewModel ou l'activité. Les dépendances sont injectées via le constructeur avec l'annotation @Inject.

// Définition du ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injection de dépendance via le constructeur
) : ViewModel() {
    // Logique du ViewModel
}
// Déclaration de la dépendance (Repository)
@ActivityRetainedScoped // Exemple de scope
class MyRepository @Inject constructor() {
    // Logique du repository
}

Dans l'Activity ou le Fragment, le ViewModel est obtenu via le délégué viewModels() ou activityViewModels():

// Dans l'Activity
@AndroidEntryPoint // Annotation pour les composants Hilt
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Obtention du ViewModel via le délégué

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Utilisation du viewModel
    }
}
// Dans le Fragment
@AndroidEntryPoint // Annotation pour les composants Hilt
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Obtention du ViewModel pour ce fragment
    // ou
    // private val activityViewModel: MyViewModel by activityViewModels() // Obtention du ViewModel lié à l'activité

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

Les dépendances nécessaires (par exemple, modules pour fournir MyRepository) doivent être configurées dans les modules Hilt.

// Exemple de module Hilt
@Module
@InstallIn(SingletonComponent::class) // Installation du module dans SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Exemple de scope pour singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Fourniture d'une instance de MyRepository
    }
}