es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El ViewModel de Android Koin con múltiples parámetros de la misma clase falla al inyectarse.

Estoy siguiendo la documentación como se indica aquí https://insert-koin.io/docs/reference/koin-android/viewmodel/#viewmodel-and-injection-parameters

La única diferencia es que mi viewmodel tiene 2 parámetros (además de los repos inyectados por Koin) de la misma clase String. Llamémoslos stringA = “red” y stringB = “blue”.

Cuando paso los parámetros, se definen claramente de manera diferente. Pero cuando se instancia el viewmodel, registro las cadenas y ambas tienen el valor de stringA, “red”.

Puedo envolverlos a ambos en una data class, pero idealmente me gustaría tenerlos por separado, ¿alguna idea de qué está mal o qué se debe hacer?

Módulo de Koin

val viewModelsModule = module {
    viewModel { params ->
        MyViewModel(get(), stringA = params.get(), stringB = params.get(), get())
    }
}

Inyección en el ViewModel

val viewModel: MyViewModel = getViewModel(parameters = {parametersOf("red", "blue")})

Chequeo de parámetros dentro de MyViewModel

init {
    viewModelScope.launch {
        Log.d("TAG", "$stringA $stringB")
    }
}

y muestra:

red red
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en cómo estás llamando a los parámetros en la función viewModel. En tu módulo Koin, estás utilizando params.get() para recuperar los valores de stringA y stringB.

    Sin embargo, en tu código de ViewModelInjection, estás pasando los parámetros como parametersOf("red", "blue"). Esto significa que ambos parámetros están siendo asignados al valor de "red", ya que es el primer valor en la lista de parámetros.

    Para solucionar esto, puedes modificar tu módulo Koin para pasar los parámetros como argumentos con nombre:

    val viewModelsModule = module {
      viewModel { (stringA: String, stringB: String) ->
        MyViewModel(get(), stringA = stringA, stringB = stringB, get())
      }
    }
    

    Luego, en tu código de ViewModelInjection, puedes llamar a los parámetros como argumentos con nombre:

    val viewModel: MyViewModel = getViewModel {
      parametersOf(stringA = "red", stringB = "blue")
    }
    

    Esto garantizará que ambos parámetros reciban sus valores correctos.

Comments are closed.