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.mdIssue del tema en caso deseen reabrirlo
https://github.com/InsertKoinIO/koin/issues/62Github de Koin
https://github.com/InsertKoinIO/koinKodein 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
Link de referencia que revise
https://devexperto.com/clean-architecture-android/