Divide y vencerás: componente de navegación en un proyecto de varios módulos

En este artículo, aprenderá cómo puede organizar gráficos de módulos / características / historias de usuario individuales, centralizarlos, crear una navegación directa entre ellos y agregar Safe Args con un complemento en la parte superior.





Ahora se encuentra en la tercera parte de un artículo extenso sobre el componente de navegación en un proyecto de varios módulos . Si no comprende una sola palabra anterior, le insto a que primero se familiarice con eso:





  • Qué bestia es este componente de navegación .





  • Cómo funciona el complemento Safe Args y qué hace .





Bueno, si ya está familiarizado con esta biblioteca, hay una buena ventaja para usted en el próximo artículo: un enfoque para organizar la navegación de múltiples pistas similar a iOS .





Primero, veamos cómo se ve la división del proyecto en módulos en nuestra empresa en la que trabajo ( magora-systems.com ):





  1. : la aplicación es el módulo principal y el punto de entrada a la aplicación. Necesita conocer todos los módulos que participan en la aplicación.





  2. : core-module contiene todas las cosas básicas: clases base, modelos, entidad, DTO, extensiones, etc. 





  3. Los módulos de utilidad se utilizan para encapsular la funcionalidad de los componentes principales de la aplicación. Por ejemplo, trabajar con una red, una base de datos o la misma navegación.





  4. Los módulos de características incluyen el trabajo de una característica / historia de usuario específica, ya sea un flujo o una pantalla.





, Safe Args .





, :





. , :





  1. feature-.





  2. Top-level .





  3. .





  4. , Top-level .





.





feature-

destination- , feature- . , Safe Args , , .





Top-level

— , , .





, .





, , global action.





, Top-level  

, :





  1. (:core)





, . , . , Lint-a, .





, , .





  1. (:app)





+ .





.





Safe args global action- feature- , .





, :app-, Top-level . …





:





: (:navigation), , - .





id action-. generated- , , id .





<item name="actionglobalnavsignin" type="id"/>
<item name="actionglobalnavsignup" type="id"/>
<item name="actionglobalnavhome" type="id"/>
<item name="actionglobalnavuserslist" type="id"/>
<item name="actionglobalnavuserdetails" type="id"/>
<item name="actionglobalnavon¨C11Cglobal¨C12Csettings" type="id"/>
<item name="action¨C13Cto_faq" type="id"/>
      
      



: Directions Args :app  





Safe args global action- feature- , .





: generated-. -. Generated- build- , ( :app), :navigation- . : generateSafeArgs, , Args- Directions- R :app, .





ext {
   navigationArgsPath = '/build/generated/source/navigation-args'
   appNavigation = "${project(':app).projectDir.path}$navigationArgsPath"
   navigationPath = "${project(':navigation').projectDir.path}$navigationArgsPath"
   navigationPackage = “com.example.navigation”
}

tasks.whenTaskAdded { task ->
   if (task.name.contains('generateSafeArgs')) {
       task.doLast {
           fileTree(appNavigation)
                   .filter { it.isFile() && it.name.contains("Directions") }
                   .forEach { file ->
                       if (file.exists()) {
                           def lines = file.readLines()
                           lines = lines.plus(2, "import $navigationPackage.R")
                           file.text = lines.join("\n")
                       }
                   }
       }
       move(file("$appNavigation"), file("$navigationPath"))
   }
}
      
      



, , . - , , , . 





— , sourceSet-s .





No me detuve en esta victoria y decidí ver qué más se podía hacer al respecto. Para ello, un proyecto en el que el cliente quería una aplicación con un menú inferior y que cada pestaña conservara su estado al salir fue útil como nunca. De esta decisión se trata la parte final de mi historia sobre la navegación multistack similar a iOS .








All Articles