Navegar con argumentos en Jetpack Compose | por Daniel Atitienei
Hay dos formas de navegar con argumentos y explicaré ambas.
- pasar argumentos directo a la pantalla
- recogerla Manejador de estado guardado fuera de Ver modelo
Primero necesitamos agregar marcadores de posición de argumento a la ruta.Navega con argumentos (solo puedes pasar tipos de cadena)@Composablefun Navigation() {val navController = RememberNavController()NavHost(navController = navController,startDestination = «home») {composable(«car/{carId}») { navBackStackEntry ->/* Extrae el ID de la ruta */val carId = navBackStackEntry.arguments?.getString(«carId»)/* Comprobamos si es nulo */carId?.let {CarScreen(carId = it.toInt())}}/* … */}}@ Composablefun Pantalla de inicio(navController: NavController) {Button(onClick = {/* Reemplace {carId} con 1 */navController.navigate(«car/{carId}».replace(oldValue = «{carId}»,newValue = «$ {1 }»))}) {Text(text = «Navegar al coche con ID 1»)}}
Contenidos
Para especificar el tipo de argumento, necesitamos agregar argumentos opcionales
- Deben incluirse utilizando la sintaxis de parámetros de consulta («?argName={argName}»).
- Deben tener un valor predeterminado establecido o tener nullability = true (lo que implícitamente establece el valor predeterminado en nulo).
composable(route = «car?carId={carId}»,arguments = listOf(navArgument(«carId») {defaultValue = 0type = NavType.IntType})) { navBackStackEntry ->/* Extrae el ID de la ruta */val carId = navBackStackEntry.arguments?.getInt(«carId»)/* Verificamos si es nulo */carId?.let {CarScreen(carId = it)}}Y si desea agregar más argumentos, agregue & entre argumentos, «?argName1={argName1}&argName2={argName2}» En mi opinión, esta es la mejor manera de navegar con argumentos porque si queremos hacer, por ejemplo, una llamada API (por ejemplo, el automóvil con una ID específica de la base de datos ). Eso es lo que queremos en Ver modelo porque el es el responsable para el tratamiento y gestión de los datos.clase CarViewModel(savedStateHandle: SavedStateHandle) : ViewModel() {var carId = mutableStateOf(0)init {savedStateHandle.get
Configuración
Usamos un Moshi que facilita el análisis de JSON en las clases de Java y Kotlin. Agreguemos la dependencia a .app/build.gradledependencies {implementation(«com.squareup.moshi:moshi-kotlin:1.14.0»)}
Crear el JSON
@Composablefun HomeScreen(navController: NavController) {Button(onClick = {/* Replace {car} with carJson */val car = Car(id = «1»title = «Porche Panamera»)val moshi = Moshi.Builder() . addLast(KotlinJsonAdapterFactory()).build()val jsonAdapter: JsonAdapter
Ahora tenemos los 2 métodos de paso mencionados anteriormente
- Pasar argumentos directamente a la pantalla
@Composablefun Navigation() {val navController = RememberNavController()NavHost(navController = navController,startDestination = «home») {composable(«car/{car}») { navBackStackEntry ->/* Extrae el JSON automático de la ruta * / val carJson = navBackStackEntry.arguments?.getString(«car»)/* Comprobamos si es nulo */carJson?.let {val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build() val jsonAdapter : Adaptador Json