Middle+
How do you inject a ViewModel using Dagger Hilt?
sobes.tech AI
Answer from AI
Using the @HiltViewModel annotation for the ViewModel itself and @ActivityRetainedScoped or @ViewModelScoped for dependencies that should live as long as the ViewModel or activity. Dependencies are injected via the constructor with the @Inject annotation.
// ViewModel definition
@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository // Dependency injection via constructor
) : ViewModel() {
// ViewModel logic
}
// Declaring a dependency (Repository)
@ActivityRetainedScoped // Example scope
class MyRepository @Inject constructor() {
// Repository logic
}
In an Activity or Fragment, the ViewModel is obtained using the viewModels() or activityViewModels() delegate:
// In Activity
@AndroidEntryPoint // Annotation for Hilt components
class MyActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels() // Obtaining ViewModel via delegate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Using viewModel
}
}
// In Fragment
@AndroidEntryPoint // Annotation for Hilt components
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels() // Obtaining ViewModel for this fragment
// or
// private val activityViewModel: MyViewModel by activityViewModels() // Obtaining ViewModel linked to activity
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// Using viewModel
}
}
Necessary dependencies (e.g., modules for providing MyRepository) should be configured in Hilt modules.
// Example Hilt module
@Module
@InstallIn(SingletonComponent::class) // Installing module in SingletonComponent
object RepositoryModule {
@Provides
@Singleton // Example scope for singleton
fun provideMyRepository(): MyRepository {
return MyRepository() // Providing an instance of MyRepository
}
}