Sobes.tech
Middle+

Como injetar ViewModel usando Dagger Hilt?

sobes.tech IA

Resposta da IA

Com a anotação @HiltViewModel para o próprio ViewModel e @ActivityRetainedScoped ou @ViewModelScoped para dependências que devem viver tanto quanto o ViewModel ou a atividade. As dependências são injetadas através do construtor com a anotação @Inject.

// Definição do ViewModel
@HiltViewModel
class MyViewModel @Inject constructor(
    private val myRepository: MyRepository // Injeção de dependência via construtor
) : ViewModel() {
    // Lógica do ViewModel
}
// Declaração de dependência (Repository)
@ActivityRetainedScoped // Exemplo de escopo
class MyRepository @Inject constructor() {
    // Lógica do repositório
}

Na Activity ou Fragment, o ViewModel é obtido usando o delegado viewModels() ou activityViewModels():

// Na Activity
@AndroidEntryPoint // Anotação para componentes Hilt
class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels() // Obtenção do ViewModel via delegado

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Uso do viewModel
    }
}
// No Fragment
@AndroidEntryPoint // Anotação para componentes Hilt
class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModels() // Obtenção do ViewModel para este fragmento
    // ou
    // private val activityViewModel: MyViewModel by activityViewModels() // Obtenção do ViewModel vinculado à atividade

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

As dependências necessárias (por exemplo, módulos para fornecer MyRepository) devem ser configuradas nos módulos do Hilt.

// Exemplo de módulo Hilt
@Module
@InstallIn(SingletonComponent::class) // Instalação do módulo no SingletonComponent
object RepositoryModule {

    @Provides
    @Singleton // Exemplo de escopo para singleton
    fun provideMyRepository(): MyRepository {
        return MyRepository() // Fornecendo uma instância de MyRepository
    }
}