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
}
}