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 ):
: app é o módulo principal e ponto de entrada para o aplicativo. Ele precisa saber sobre todos os módulos participantes do aplicativo.
: core-module contém todas as coisas básicas: classes básicas, modelos, entidade, DTO, extensões, etc.
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.
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 .
, :
. , :
feature-.
Top-level .
.
, Top-level .
.
feature-
destination- , feature- . , Safe Args , , .
Top-level
— , , .
, .
, , global action.
, Top-level
, :
(:core)
− , . − , . , Lint-a, .
− , , .
(: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 .