Nine Circles of Hell para crear un proyecto multiplataforma de Kotlin en Koin Notes | migrar de Maksimnazalevich | mayo 2022

Foto de James Lee en Unsplash

Introducción

Estoy desarrollando un pequeño proyecto multiplataforma (Android, Desktop) para encontrar coches en subasta usando Koin como inyección de dependencia. Koin causa un pequeño inconveniente en la forma de describir todas las dependencias en un solo lugar, por lo que a menudo ocurren excepciones durante el desarrollo (o se me olvida declarar una clase o agregar un nuevo parámetro).

Notas Koin 1.0.0-beta-1

Un día sucedió un milagro, se lanzó koin-annotations beta-1 🥳. Ya no tienes que describir los módulos koin, solo escribes una nota encima de la clase y la vida es buena. No dudé en incorporarlos a mi proyecto siguiendo la documentación. El primer problema fue agregar la ruta a los módulos generados en srcDirs. Dado que el proyecto es multiplataforma, KSP genera 2 directorios: Android y Desktop. Por cierto, Android Studio espera que también se muestre el directorio compartido, por lo que todas las importaciones están en rojo. De todos modos, el proyecto se construye porque el compilador usa directorios de plataforma durante la compilación.Captura de pantalla de importaciones rotas Resolví torpemente este problema simplemente agregando la ruta al directorio del escritorio como al directorio común, y el estudio comenzó a ver todas las importaciones. 🎉Captura de pantalla de las importaciones de trabajo Desafortunadamente, esto causó un problema aún mayor. Ahora, cuando compila un objetivo de Android, la compilación fallará con una excepción de duplicación, porque agregué la ruta al directorio del escritorio como una ruta compartida, el compilador de Android ve todos los recursos, no solo los suyos.Captura de pantalla de excepción de duplicación Tuve que eliminar el código anterior y continuar mi trabajo con importaciones rojas. ☹️También creé un problema con el problema descrito. Entonces, el proyecto está sincronizado, todo está bien y puede eliminar los módulos koin y reemplazarlos con anotaciones. Decidí comenzar la migración desde un pequeño módulo declarado en la carpeta común principal. Enlace Eliminé mi módulo koin y reemplacé todo con anotaciones. La aplicación se compiló, se instaló en el dispositivo y… se bloqueó al iniciarse. Resulta que mi interfaz ScreenProvider y su implementación AppScreenProvider se declaran en diferentes módulos de Gradle. Las anotaciones de Koin simplemente no tienen la capacidad de verificar las dependencias entre diferentes módulos de Gradle. Encontré este problema en los problemas de esta biblioteca, ahora es imposible solucionarlo, por lo que mi código termina en un alijo de git y la implementación se pospone indefinidamente. ☹️Foto de Moritz Kindler en Unsplash

Notas Koin 1.0.0-beta-2

Unas semanas más tarde, se lanzó Koin-Annotations Beta-2 🥳 con una solución para mi bloqueador. Voy a volver a la tarea de integrar anotaciones y reconstruir todos los módulos. El proyecto está ensamblado y todo funciona, pero… Se encontraron 2 problemas:1. En el proyecto utilizo interfaces selladas pero la biblioteca no las maneja correctamente, KSP no puede acceder a las interfaces anidadas. Así que necesito cambiar su notación: el nuevo enfoque me permite acceder a la interfaz B directamente en lugar de hacerlo a través de la interfaz A (no es crítico, pero no me gusta cómo se ve este enfoque). Creé un problema con este problema.2. Las anotaciones de Koin le permiten inyectar un módulo en otro usando la propiedad de inclusión en la anotación del módulo: Sin embargo, en mi caso, los módulos de Koin se colocan en diferentes módulos de Gradle y KSP no puede encontrar una importación para el módulo incluido. También creé un problema con este problema.

Conclusión

Honestamente puedo decir que Si está comenzando un proyecto desde cero y no necesita usar interfaces selladas o construir módulos entre sí, puede intentar usar las anotaciones de Koin. La biblioteca ahorra mucho tiempo al desarrollador. 😉

Esperando anotaciones de koin 1.0.0-beta-3

Sin embargo, estoy volviendo a almacenar mi código solo porque no quiero adaptar el código escrito previamente a los errores de la biblioteca, por lo que todavía estoy esperando que la versión beta-3 finalmente fusione la biblioteca en la rama de desarrollo. 😏Proyecto principal: https://github.com/DoTheMonkeyBusiness/CopartAdvancedAuctionEjemplo de proyecto donde puede observar los problemas: https://github.com/DoTheMonkeyBusiness/koinAnnotationIssueFoto de Markus Spiske en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada.