¡No vuelvas a cargar de tu lista!

Cuando desea permitir una navegación de un fragmento a otro, pero desea evitar la navegación hacia atrás a lo largo de esa ruta, popUpTola ruta de navegación en esa acción.

Es útil cuando deja un estado de carga o un estado de error para la siguiente pantalla.

Nota: nav_paths es el archivo xml que contiene el gráfico de navegación para mi proyecto.

<action
                android:id="@+id/action_errorDisplayFragment_to_loadingFragment"
                app:destination="@id/loadingFragment"
                app:popUpTo="@id/nav_paths" />

¡No choques en una rotación!

Si usa una configuración donde girar la pantalla resultaría en una llamada a una función de navegación, es muy probable que intente navegar a la misma pantalla en la que ya estaba.

Esto bloquea la aplicación con un

java.lang.IllegalArgumentException: navigation destination com.aniketkadam.someapp:id/action_loadingFragment_to_someListFragment is unknown to this NavController 

¡No choques en una rotación!

Si usa una configuración donde girar la pantalla resultaría en una llamada a una función de navegación, es muy probable que intente navegar a la misma pantalla en la que ya estaba.

Esto bloquea la aplicación con un

java.lang.IllegalArgumentException: navigation destination com.aniketkadam.someapp:id/action_loadingFragment_to_someListFragment is unknown to this NavController

Para evitar eso, puede usar esta función de extensión y siempre navegar a través de ella. Ayuda si está usando NavDirections en lugar de rutas escritas para asegurarse realmente de que esta pueda ser una ruta válida.

Todo lo que estamos haciendo aquí, es asegurarnos de que cada nodo del viaje a la ruta sea válido, ya que casi ninguno de ellos puede ser nulo.

private fun NavController.safeNavigate(d: NavDirections) =

    currentDestination?.getAction(d.actionId)?.let { navigate(d) }
        ?: Timber.e("Invalid route for direction ${d} with id ${d.actionId}")

No lo necesitaba en ninguna parte excepto esa pantalla, así que elegí una función de extensión privada. Si lo va a usar en varios lugares, ¡consérvelo con el resto de sus funciones de extensión!