4
respostas

Passar função por parâmetro Koin

Olá.

Como eu posso passar uma função por parâmetro para um objeto injetado com o Koin? Eu poderia fazer algo como:

single <MeyRepository> { (meuMetodo: (data: Any) -> Unit) ->
    MeuRepository(get(), get(), get(), meuMetodo)
}

Como isso funciona, pois não sei onde passar esse parametro como nos outros exemplos do Alura++ sobre Koin onde é feito assim: { parametersOf(loteId) }

Obrigado.

4 respostas

Fala ai Rodrigo, de boa ?

Cara, imagino que isso não role.

Só por curiosidade, qual é o cenário que está tentando fazer?

Oi Matheus! Tudo certo e com vc?

Na verdade meu problema é implementar alguma forma de trazer uma resposta do Repository para o ViewModel, ou seja, meu Repository vai trazer dados de uma API ou da base local para o ViewModel. Minha dúvida é: qual a melhor forma de fazer isso? Passo uma função como callback, uso uma interface ou tem outra forma melhor e mais bonita (seguindo as boas práticas)?

Pensei em passar uma função por parâmetro e usá-la como um callback, também pensei em implementar uma interface. Em Java, eu usaria uma interface e passaria a instância como parâmetro no construtor da classe. Em Kotlin usando Koin, não sei fazer isso.

Segue mais ou menos o que fiz nos meus testes:

ViewModel

class FormularioViewModel (
    private val id: Long,
    private val repository: MeuRepository
) : ViewModel() {
    ...
    fun metodoDeTeste(){
        ...
    }
    ...
}

Repository

class MeuRepository (
    private val loteDao: LoteDao,
    private val caracteristicaDao: CaracteristicaDao,
    private val multivalorDao: MultivalorDao,
    private val atualizaModel: (objDTO: Any)-> Unit
){
    ...

    ...
}

AppModules

val appModules = module {

    single <AppDatabase> {
        Room
            .databaseBuilder(get(), AppDatabase::class.java, BuildConfig.DATABASE_NAME)
            .allowMainThreadQueries()
            .build()
    }

    single <LoteDao> {
        get <AppDatabase>().loteDao()
    }

    single <CaracteristicaDao> {
        get <AppDatabase>().caracteristicaDao()
    }

    single <MultivalorDao> {
        get <AppDatabase>().multivalorDao()
    }

    single <MeuRepository> { (atualizaModel: (data: Any) -> Unit) ->
        MeuRepository(get(), get(), get(), atualizaModel)
    }

    viewModel <FormularioActivityViewModel> { (id: Long) ->
        FormularioActivityViewModel(id, get())
    }

}

Abraço

Não consegui ver um motivo pra voce fazer isso, o seu repository precisa apenas passar essas informações pra frente, acho que um livedata com couroutines já resolveria o problema, você poderia apenas expor seu live data e tudo daria certo.

Desculpa, não consegui entender. Imaginando que eu efetue uma requisição para um servidor e este devolve uma mensagem de sucesso, como eu faço para exibir esta mensagem para o usuário? Pois uma vez que esta mensagem esteja acessível no método response do Retrofit, preciso fazer esta chegar até uma Dialog na Activity, passando pelas classes: Retrofit -> MeuRepository -> MeuViewModel -> MinhaActivity(aqui contém uma implementação de Dialog).

Não conheço courotines, isso resolve minha dúvida? Existe outra maneira de fazer isso, alguma prática de programação ou algo do gênero?

Obrigado pela ajuda.