3
respostas

ViewModelProvider.Factory

Boa noite!

Estou utilizando o ViewModelProvider.Factory para me ajudar a criar as instância porém a viewModel tem "repository" e "converter" como dependência e o repository tem uma interface api no seu construtor

tive dificuldade de montar essa injeção no fragment alguém consegue me ajudar?

3 respostas

Olá Luciano, tudo bem?

Você pode tentar solucionar dessa forma:

  • Criamos uma classe ViewModelFactory que implementa ViewModelProvider.Factory. Isso permitirá que criemos uma instância do nosso ViewMode e colocamos as dependências nele.
class ViewModelFactory(
    private val repository: Repository,
    private val converter: Converter
) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(YourViewModel::class.java)) {
            return YourViewModel(repository, converter) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}
  • Agora no Fragment, utilizamos ViewModelProviders.of para obter instância do ViewModel, no primeiro argumento passaremos o fragment atual e a instância do ViewModelFactory como o segundo argumento.
val api = Api()
val repository = Repository(api)
val converter = Converter()
val factory = ViewModelFactory(repository, converter)

viewModel = ViewModelProviders.of(this, factory).get(YourViewModel::class.java)

Isso é um assunto bem complexo, se ficou qualquer dúvida, não exite em voltar a pergunar, estarei á disposição :)

Forte abraço e bons estudos.

O Repository tem como argumento uma interface API

Como fica nesse caso????

class SampleRepository(private val service: SampleApi) {

    suspend fun getList() = service.getResponse()

Como instancio o repository nesse caso?

class SampleFragment : Fragment(R.layout.fragment_sample) {

    private val repository = SampleRepository()
    private val converter =SampleConverter()
    private val viewModel: SampleViewModel by viewModels {SampleViewModel.factory(repository, converter) }

UP !! Aguardando resposta acima