Generalidades

Navegación programáticamente escalable en Android con Jetpack Navigation | Por Susenthapa | Abril de 2022

Foto de Bruno Martins en Unsplash

Jetpack Navigation es una gran biblioteca que nos permite usar Fragmentos sin tener que pensar en FragmentManager y FragmentTransactions, que son dolorosos de usar.

Una cosa que no sé sobre Android es que crean excelentes bibliotecas, pero de alguna manera encontraron una manera de vincular la biblioteca al xml y arruinar todo. No odio xml, pero creo que sería mejor si pudiéramos hacer todo programáticamente (composición Jetpack). Con xml, existe este acoplamiento oculto entre xml y el código, que no es obvio al principio. Una vez que comience a escalar (código base único con múltiples aplicaciones cliente), se encontrará con las limitaciones de xml.xml. En pocas palabras, xml no es dinámico, no puede cambiar las etiquetas xml en tiempo de ejecución (tal vez pueda, hágamelo saber). De todos modos, me alegro de que Android se esté alejando de xml.

¿Qué es la escalabilidad de las aplicaciones móviles?

Antes de continuar, intentemos responder a esta simple pregunta, ¿qué es la escalabilidad en una aplicación móvil?

Escuchamos mucho sobre la escalabilidad en entornos de desarrollo de back-end, y básicamente significa escalar un servicio a la mayor cantidad de usuarios posible mediante el uso de arquitecturas como microservicios o simplemente agregando servidores para manejar la carga. En el contexto de una aplicación móvil, no es que después de que 100000 usuarios instalen la aplicación, su aplicación falla porque no puede manejar más instalaciones nuevas (su backend puede fallar, pero ese es un caso diferente).

LEER  Las listas de reproducción de ExoPlayer son diferentes. La API de ExoPlayer MediaItem es excelente ... | Autor: Nick Ross | Diciembre de 2021

Según tengo entendido, la escalabilidad de una aplicación móvil significa extender la aplicación al cliente (no al usuario final). Si alguna vez ha trabajado para una empresa, probablemente esté familiarizado con su funcionamiento. Las empresas suelen ser B2B (empresa a empresa) y no tratan directamente con los usuarios finales. Por ejemplo, en una empresa que brinda soluciones de pedido de alimentos a los clientes, los clientes son restaurantes. Con una arquitectura extensible, debería poder compartir la misma base de código entre todos los clientes, al tiempo que permite la personalización de la aplicación (por ejemplo, un restaurante puede querer esta pantalla, mientras que otro botón Enrutar a una página diferente cuando se hace clic).

Si desea que su aplicación sea escalable, eso significa que su aplicación debe manejar nuevos clientes sin realizar cambios importantes en el código base.

muestra

Esta es la aplicación que construiremos. Puede encontrar el código fuente a continuación.

https://github.com/susonthapa/programmatic-jetpack-navigation/tree/test-programmatic-navigation

Problemas con la navegación XML

  1. No hay configuración dinámica en tiempo de ejecución.
  2. No apto para proyectos modulares que tienen que usar mucha inversión de dependencia.
  3. Safe-args a veces no funciona con IDE.
  4. No escala bien si tienes docenas de pantallas.

enrutamiento personalizado

En Android, cualquier cosa que pueda hacer con xml se puede (casi) hacer en código y, finalmente, el xml se convierte a un formato intermedio y luego se infla en tiempo de ejecución. Entonces, en esta historia, diseñaremos un enrutador personalizado para manejar la navegación por nosotros. Podremos personalizar la ruta sobre la marcha. Hice dos implementaciones para esto, una usa identificadores xml y la otra usa enrutamiento. Voy a hablar sobre el enrutamiento porque ahí es donde va Android con Jetpack Compose, pero si desea ver la implementación usando Id, puede consultar esta confirmación.

Cuadro grande.

Desglosemos el diagrama.

Fragmentos y Mapas de Actividad

Almacenamos todos los fragmentos y actividades que se pueden navegar en nuestra aplicación en un map De esta manera podemos enrutar dinámicamente y anular las rutas que queramos en tiempo de ejecución.Aqui hay uno Screen Clase sellada utilizada para definir todas las pantallas presentes en la aplicación.también creamos FragmentScreen y ActivityScreen Para Fragmentos y Actividades respectivamente.

Tener createRoute Una función que devuelve un par de cadenas (también podríamos crear una clase separada para esto, pero esto es por simplicidad), donde primero es id Esto se utilizará desde map pantalla, la segunda es la ruta real con todos los parámetros.

Ahora, necesitamos configurar el mapeo entre rutas y destinos. Application clase.

enrutador personalizado

El componente busca un fragmento o actividad y una ruta hacia eso. La idea es simple, como se muestra en el diagrama de flujo anterior. Primero, tratamos de enrutar al destino si ya existe en la pila trasera. Si falla, intentamos crear un nuevo destino y enrutarlo, de lo contrario, mostramos una pantalla de error. Esta es una implementación muy básica, con mucho margen de mejora (como agregar pantallas de error para las rutas de actividad o agregar rutas para los diálogos).

fragmento básico

Este es solo un fragmento principal que expone el enrutador al fragmento secundario y maneja el análisis de parámetros, también podemos hacer lo mismo con las actividades. Podemos mejorar esto aún más agregando el manejo de errores al analizar los parámetros, de modo que si no tenemos los parámetros que necesitamos, podemos dirigirnos a una pantalla de error personalizada en lugar de fallar.

Configuración de navegación inferior

Podemos configurar programáticamente nuestras rutas usando la navegación inferior. Para hacer esto, podemos crear el menú programáticamente, luego agregar el destino al gráfico y configurarlo usando la navegación inferior.

He enumerado algunos casos de uso que son muy comunes en Android.

Navegación sencilla

Ruta a Fragmento o Actividad.

Navegar con parámetros de fragmento

estamos usando createRoute Una función que acepta parámetros requeridos por la ruta.

Navegación animada

Dado que los enrutadores personalizados son solo envoltorios para Jetpack Navigation, puede personalizar lo que admite Jetpack Navigation.

destino popular

Un caso de uso común es mostrar el destino actual cuando navega a una pantalla para que cuando el usuario presione el botón Atrás no pueda ver la pantalla anterior. Esto se puede lograr.

Bueno, eso es mucho código, si esto se ha hecho, estoy seguro de que verá las ventajas de este enfoque, aquí hay algunas de ellas.

  1. enrutamiento dinámico: Podemos cambiar la asignación del destino en tiempo de ejecución. Suponiendo que desea mostrar diferentes pantallas para la misma ruta según la respuesta del servidor, entonces puede hacerlo. Simplemente anule la ruta en el mapa (en esta implementación, el mapa es inmutable, pero puede cambiarlo para que sea mutable o exponer algunos métodos).
  2. tipo de seguridad: Aunque tenemos SafeArgs complemento xml, que se obtiene listo para usar usando createRoute Características.
  3. Manejo de errores globales para rutas: Al igual que en la web, podemos personalizar las páginas de error para 404, podemos lograr el mismo efecto con esta arquitectura.
  4. fácil de usar: Para agregar un nuevo destino, simplemente agregue la ruta a map Luego use esa ruta en cualquier lugar de la aplicación.
  5. Fácil integración DI: Puede agregar fácilmente un enrutador a su core Luego configure la ruta en el módulo. app módulo. Después de eso, cualquier módulo funcional se puede enrutar a cualquier pantalla mediante el enrutamiento sin estar vinculado a un módulo específico.

Esta es la historia. Espero que hayas aprendido algo útil. Esta arquitectura es muy flexible y puede personalizarla fácilmente.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba