en android, kotlin

Kotlin Koin inyección con parámetros

Para instalar y configurar un ejemplo básico de ejemplo puede verlo en la documentación https://start.insert-koin.io/#/quickstart/android-java

Luego surge la pregunta de cómo hacerlo si al momento de construir necesita parámetros del lugar donde se instancia , como el caso del Presenter(iView), donde al instancia el presenter se debe pasar la vista que implementa la interfaz de la vista que usa el presenter.

Modificando un poco el ejemplo se puede hacer así.

Para mi caso, la clase Presenter y interfaz en kotlin es:

class PedidosPresenter(var view: IPedidosView) {
    fun sayHello () {
        view.sayHello()
    }
}

interface IPedidosView
{
    fun sayHello()
}

sayHello, solo es un método para comprobar que view es el fragment que debe referenciar.

En mi caso el fragment esta en Java, mas abajo coloco el como es el mismo código en kotlin.

public class PedidosFragment extends Fragment implements IPedidosView {

    private Lazy<PedidosPresenter> pedidosPresenter = KoinJavaComponent.inject(PedidosPresenter.class, null , () -> DefinitionParametersKt.parametersOf(this)); //se coloco THIS porque el fragmento es quien implemento IPedidosView

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       
        View view = inflater.inflate(R.layout.fragment_home_pedidos, container, false);
        pedidosPresenter.getValue().sayHello();
         /**more code**/
        return view;
    }

    @Override
    public void sayHello() {
        Log.i("KOIN","Oh yes");
    }
 /**more code**/
}

Y la configuración de los módulos:

object KoinModules
{
    @JvmStatic
    fun getModules(): Module {
        return module {
            single { (view : IPedidosView) -> PedidosPresenter(view) }
        }
    }
}

En resumen, en la configuración de módulos se indica que parámetros recibirá

single { (view : IPedidosView) -> PedidosPresenter(view) }

y en la inyección, se debe agregar como tercer parámetro un mapeo de los parámetros que necesita.

private Lazy<PedidosPresenter> pedidosPresenter = KoinJavaComponent.inject(PedidosPresenter.class, null , () -> DefinitionParametersKt.parametersOf(this)); //se coloco THIS porque el fragmento es quien implemento IPedidosView

Las demás configuraciones son igual al de la guía.

Referencias:

Inyección con parámetros en kotlin
https://github.com/InsertKoinIO/koin/blob/master/koin-projects/docs/reference/koin-core/injection-parameters.md

Issue del tema en caso deseen reabrirlo
https://github.com/InsertKoinIO/koin/issues/62

Github de Koin
https://github.com/InsertKoinIO/koin

Kodein opción a Koin en caso no se pudiera
https://www.kotlindevelopment.com/koin-vs-kodein/

Articulo de Clean arquitecture por el cual surgió la duda
https://devexperto.com/clean-architecture-android/

Link de referencia que revise

Escriba un comentario

Comentario