Sobes.tech
Middle+

¿Cómo inyectar ViewModel usando Dagger Hilt?

sobes.tech AI

Respuesta de la IA

Con la anotación @HiltViewModel para la propia ViewModel y @ActivityRetainedScoped o @ViewModelScoped para las dependencias que deben vivir tanto como la ViewModel o la actividad. Las dependencias se inyectan a través del constructor con la anotación @Inject.

// Definición de ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Inyección de dependencia a través del constructor
) : ViewModel() {
    // Lógica de ViewModel
}
// Declaración de dependencia (Repository)
@ActivityRetainedScoped // Ejemplo de scope
class MyRepository @Inject constructor() {
    // Lógica del repositorio
}

En la Activity o Fragment, la ViewModel se obtiene mediante el delegado viewModels() o activityViewModels():

// En la Activity
@AndroidEntryPoint // Anotación para componentes Hilt
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Obtención de ViewModel mediante delegado

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Uso de viewModel
    }
}
// En el Fragment
@AndroidEntryPoint // Anotación para componentes Hilt
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Obtención de ViewModel para este fragmento
    // o
    // private val activityViewModel: MyViewModel by activityViewModels() // Obtención de ViewModel vinculada a la actividad

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

Las dependencias necesarias (por ejemplo, módulos para proporcionar MyRepository) deben configurarse en módulos de Hilt.

// Ejemplo de módulo de Hilt
@Module
@InstallIn(SingletonComponent::class) // Instalación del módulo en SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Ejemplo de scope para singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Provisión de una instancia de MyRepository
    }
}