Componente de navegação e navegação multi backstack

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:





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:









  1. Adicione FragmentContainer.





  2. NavHostFragment .





  3. NavHostFragment FragmentManager-a.





, :





  • sign in / up flow, on boarding , , . , , .





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








All Articles