Agora você está na quarta parte de um excelente artigo sobre o componente de navegação em um projeto de vários módulos. Se você já conhece:
O que é o componente de navegação
Como o plugin Safe Args funciona e o que ele faz
Como você pode construir um trabalho com o Componente de Navegação em um projeto de vários módulos
Então, bem-vindo à parte final da história sobre minha experiência com esta biblioteca maravilhosa - sobre a solução para navegação multistack semelhante ao iOS.
Você pode ver como tudo funciona aqui
Se você não sabe, então saia e entre normalmente leia primeiro os três artigos acima.
Além da biblioteca Navigation Component, o Google lançou vários add-ons de front-end chamados NavigationUI que ajudam a conectar a navegação a BottomBar, Menu e outros componentes padrão. Porém, freqüentemente, há requisitos de que cada guia tenha sua própria pilha e os estados atuais sejam salvos ao alternar entre eles. Infelizmente, fora da caixa, Navigation Component e NavigationUI não fazem isso.
O suporte para essa abordagem foi fornecido pelo próprio Google em seu repositório de exemplos de componentes de arquitetura no GitHub ( https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample ). Sua essência é simples:
Adicione FragmentContainer.
NavHostFragment .
NavHostFragment FragmentManager-a.
, :
. NavigationBottomBar Deep Link-. , deep link- . , — . NavigationExtensions 250 loc, lazy- NavHost-, :
/ NavHost-:
fun obtainNavHostFragment(
fragmentManager: FragmentManager,
fragmentTag: String,
navGraphId: Int,
containerId: Int
): NavHostFragment {
// If the Nav Host fragment exists, return it
val existingFragment =
fragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment?
existingFragment?.let { return it }
// Otherwise, create it and return it.
val navHostFragment = NavHostFragment.create(navGraphId)
fragmentManager.beginTransaction()
.add(containerId, navHostFragment, fragmentTag)
.commitNow()
return navHostFragment
}
NavHost-:
protected fun selectTab(tab: Tab) {
val newFragment = obtainNavHostFragment(
childFragmentManager,
getFragmentTag(tabs.indexOf(tab)),
tab.graphId,
containerId
)
val fTrans = childFragmentManager.beginTransaction()
with(fTrans) {
if (selectedFragment != null) detach(selectedFragment!!)
attach(newFragment)
commitNow()
}
selectedFragment = newFragment
currentNavController = selectedFragment!!.navController
tabSelected(tab)
}
“Back”:
activity?.onBackPressedDispatcher?.addCallback(
viewLifecycleOwner,
object: OnBackPressedCallback(true){
override fun handleOnBackPressed() {
val isNavigatedUp = currentNavController.navigateUp()
if(isNavigatedUp){
return
}else{
activity?.finish()
}
}
}
)
iOS-like , lazy- . — , .