Neste artigo, você aprenderá quem é esse Safe Args, como ele facilita a vida e qual é o produto de seu trabalho, inclusive nos bastidores.
Agora você está na segunda parte de um grande artigo sobre o Componente de Navegação em um projeto de vários módulos. Se esta é a primeira vez que você ouve falar do Navigation Component, recomendo que você leia primeiro o que é o Navigation Component . Se você já está familiarizado com o básico, pode passar para o mais interessante:
Trabalhar com o componente de navegação em um projeto de vários módulos em conjunto com o SafeArgs.
Solução de navegação multiestacas
Safe Args é um plugin separado do Navigation Component, mas foi criado especificamente para tornar a biblioteca mais fácil de trabalhar. Com ele, não há necessidade de especificar o id de destino e passar parâmetros através do Bundle - o plugin gera classes separadas para isso e possui um conjunto de extensões para trabalhar com elas. Vamos descobrir como tudo funciona.
Primeiro, junto com o plugin, há uma nova tag no xml: <argument>. Ele pode ser aplicado tanto à ação quanto ao destino - dessa forma, você pode enviar e receber parâmetros de uma forma mais conveniente. Em segundo lugar, com base nas telas e transições especificadas no gráfico, são geradas classes especiais que podem ser especificadas no NavController ao invés da ação id.
Mostre-me o 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 é uma boa adição ao Componente de Navegação, graças ao qual tornamos mais fácil para nós mesmos trabalharmos com id de transição e como receber / enviar seus argumentos. Se vai usar ou não é com você, mas a narração adicional é baseada no uso deste plugin. Alerta de spoiler: vai trazer muitos problemas, mas no final todos ficarão felizes :)
E agora a parte divertida. Vamos dar uma olhada em como você pode organizar o trabalho com o Componente de navegação em um projeto de vários módulos junto com SafeArgs e navegação multistack semelhante ao iOS .