Safe Args es un fiel asistente del componente de navegación

En este artículo, aprenderá quién es Safe Args, cómo hace la vida más fácil y cuál es el producto de su trabajo, incluso entre bastidores.





Ahora se encuentra en la segunda parte de un artículo extenso sobre el componente de navegación en un proyecto de varios módulos. Si es la primera vez que oye hablar del componente de navegación, le recomiendo que primero lea qué es el componente de navegación . Si ya está familiarizado con los conceptos básicos, puede continuar con lo más interesante:





Safe Args es un complemento que está separado del componente de navegación, pero fue creado específicamente para facilitar el trabajo con la biblioteca. Con él, no es necesario especificar el ID de destino y pasar parámetros a través del Bundle: el complemento genera clases separadas para esto y tiene un conjunto de extensiones para trabajar con ellas. Averigüemos cómo funciona todo.





Primero, junto con el complemento, hay una nueva etiqueta en xml: <argumento>. Se puede aplicar tanto a la acción como al destino; de esta manera, puede enviar y recibir parámetros de una manera más conveniente. En segundo lugar, en función de las pantallas y transiciones especificadas en el gráfico, se generan clases especiales que se pueden especificar en NavController en lugar de la acción id.





¡Enséñame el código!

<navigation    
    xmlns:android=”http://schemas.android.com/apk/res/android"    
    xmlns:app=”http://schemas.android.com/apk/res-auto"    
    xmlns:tools=”http://schemas.android.com/tools"    
    android:id=”@+id/graphuserflow”    
    app:startDestination=”@id/fragmentUserList”>    
    <fragment        
        android:id=”@+id/fragmentUserList”        
        android:label=”FragmentUserList”        
        android:name=”com.example.usersList.UserListFragment”        
        tools:layout=”@layout/fragmentuserlist”>            
        <action            
            android:id=”@+id/actiontouserdetails”            
            pp:destination=”@id/fragmentUserList” >            
            <argument                
                android:name=”userId”                
                app:argType=”integer”                
                app:nullable=”false” />         
        </action>    
    </fragment>    
    <fragment        
        android:id=”@+id/fragmentUserDetails”        
        android:label=”FragmentUserDetails”        
        android:name=”com.example.usersList.UserDetails”        
        tools:layout=”@layout/fragmentuser_details”/>
</navigation>
      
      



: , , .  —  <argument>, users details userId. , .





class UserListFragmentDirections private constructor() {
    private data class ActionUserFromListToDetails(
    val userId: Int
    ) : NavDirections {
        override fun getActionId(): Int = R.id.actionToUserDetails
        
        override fun getArguments(): Bundle {
            val result = Bundle()
            result.putInt(“userId”, this.userId)
            return result
        }
    }
    companion object {
        fun actionToUserDetails(userId: Int): NavDirections =
        ActionToUserDetails(userId)
    }
}
      
      



generated- , ,  — , , . userId.





:





navController.navigate(
    UserListFragmentDirections.actionToUserDetails(userId)
)
      
      



destination- extension, .





private val args by navArgs<UserDetailsFragmentArgs>()
private val userId by lazy { args.userId }
      
      



, Bundle, .





Safe Args es una buena adición al componente de navegación, gracias a lo cual nos facilitamos el trabajo con la identificación de transición y el manejo de recibir / enviar sus argumentos. Si lo usa o no, depende de usted, pero la narración adicional se basa en el uso de este complemento. Alerta de spoiler: traerá muchos problemas, pero al final todos estarán felices :)





Y ahora a la parte divertida. Echemos un vistazo a cómo puede organizar el trabajo con el componente de navegación en un proyecto de varios módulos junto con SafeArgs y la navegación de múltiples pistas similar a iOS .












All Articles