Tengo un problema cuando hago una llamada a mi componible en el NavGraph , se repite 3 veces o, a veces, más veces. He mirado donde hago la llamada y no veo ningún bucle o algo.
NavGraph
fun NavGraphBuilder.addScheduleDetails( navController: NavHostController, userDataViewModel: UserDataViewModel, titulos: MutableState<String>, datosViewModel: DatosViewModel, ){ val animationState = mutableStateOf(true) composable(route = MainDestinations.SCHEDULE_DETAILS_ROUTE+"/{${NavArguments.NOMBRE_HORARIO}}") {backStackEntry -> Log.w("Call", "ScheduleDetails") titulos.value = backStackEntry.arguments?.getString(NavArguments.NOMBRE_HORARIO)!!+" " val actions = MainActions(navController = navController) DetallesHorarioScreen( nombreHorario = backStackEntry.arguments?.getString(NavArguments.NOMBRE_HORARIO), userDataViewModel = userDataViewModel, onNavToAddSubject = actions.navigateToAgregarMateria, datosViewModel = datosViewModel, animationState = animationState ) } }Impresiones desde LOG
2022-01-06 19:57:01.548 30533-30533/horarios W/Call: ScheduleDetails 2022-01-06 19:57:01.613 30533-30533/horarios W/Call: ScheduleDetails 2022-01-06 19:57:01.987 30533-30533/horarios W/Call: ScheduleDetails Llamar a composable(route = MainDestinations.SCHEDULE_DETAILS_ROUTE ...)
Card( modifier = Modifier .fillMaxWidth() .height(80.dp) .padding(10.dp) .clickable { onNavToHorario(nombre) }, //Call to navigator border = BorderStroke(width = 1.dp, color = primaryColorCustom), shape = RoundedCornerShape(10), backgroundColor = Color.White, elevation = 4.dp ) {...} onNavToHorario()
val actions = MainActions(navController = navController) (...) onNavToHorario = actions.navigateToHorario MainActions()
class MainActions(navController: NavHostController){ val navigateToHorario:(String) -> Unit = {nomHorario: String -> navController.navigate(route = MainDestinations.SCHEDULE_DETAILS_ROUTE+"/${nomHorario}") } } En otro caso, tuve un problema similar y me ocasionó animaciones, pero ya eliminé todas las animaciones en NavGraph pero el problema sigue siendo
La navegación siempre cruza los destinos, por lo que cada pantalla siempre se recompondrá varias veces. Esto se espera según la guía Thinking in Compose :
En algunos casos, se puede ejecutar una función componible para cada fotograma de una animación de interfaz de usuario. Si la función realiza operaciones costosas, como leer desde el almacenamiento del dispositivo, la función puede provocar un bloqueo de la interfaz de usuario.
No está haciendo nada malo (no está provocando efectos secundarios como parte de la composición), por lo que su código ya está bien.