Navegación componente y navegación multi backstack

Ahora se encuentra en la cuarta parte de un gran artículo sobre el componente de navegación en un proyecto de varios módulos. Si ya lo sabe:





Entonces, bienvenido a la parte final de la historia sobre mi experiencia con esta maravillosa biblioteca, sobre la solución para navegación multiestack similar a iOS.





Puedes ver como funciona todo aqui





Si no lo sabe, salga y entre normalmente lea primero los tres artículos anteriores.





Además de la biblioteca de componentes de navegación, Google ha lanzado varios complementos de interfaz llamados NavigationUI que lo ayudan a conectar la navegación a BottomBar, Menu y otros componentes estándar. Pero a menudo hay requisitos de que cada pestaña tenga su propia pila y los estados actuales se guarden al cambiar entre ellos. Desafortunadamente, el componente de navegación y la interfaz de usuario de navegación no hacen eso.





Google proporcionó soporte para este enfoque en su repositorio de muestras de componentes de arquitectura en GitHub ( https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample ). Su esencia es simple:









  1. Agregue 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