Sobes.tech
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
    }
}