Dividir e conquistar: componente de navegação em um projeto com vários módulos

Neste artigo, você aprenderá como organizar gráficos de módulos / recursos / histórias de usuário individuais, centralizá-los, construir uma navegação direta entre eles e adicionar Safe Args com um plugin no topo.





Agora você está na terceira parte de um grande artigo sobre o Componente de navegação em um projeto de vários módulos . Se você não entendeu uma única palavra acima, recomendo que primeiro se familiarize com isso:





  • Que besta é este componente de navegação .





  • Como o plugin Safe Args funciona e o que ele faz .





Bem, se você já está familiarizado com esta biblioteca, então há um bom bônus para você no próximo artigo - uma abordagem para organizar a navegação multistack semelhante ao iOS .





Primeiro, vamos ver como a divisão do projeto em módulos se parece em nossa empresa em que trabalho ( magora-systems.com ):





  1. : app é o módulo principal e ponto de entrada para o aplicativo. Ele precisa saber sobre todos os módulos participantes do aplicativo.





  2. : core-module contém todas as coisas básicas: classes básicas, modelos, entidade, DTO, extensões, etc. 





  3. Os módulos utilitários são usados ​​para encapsular a funcionalidade dos principais componentes do aplicativo. Por exemplo, trabalhar com uma rede, um banco de dados ou a mesma navegação.





  4. Módulos de recursos incluem o trabalho de um recurso específico / história do usuário, seja um fluxo ou uma tela.





, 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 .





Não me preocupei com essa vitória e decidi ver o que mais poderia ser feito a respeito. Para isso, um projeto em que o cliente desejava um aplicativo com um menu inferior e que cada aba mantém seu estado ao sair veio a calhar como nunca antes. É sobre essa decisão que se trata a parte final da minha história sobre a navegação multipack semelhante ao iOS .








All Articles