NavGraphBuilder 中的可组合项重复 3 次或更多次

Raf*_*dal 6 navigation android kotlin android-jetpack-compose

当在 中调用我的可组合项时NavGraph,我遇到问题,它重复 3 次,有时甚至更多次。我查看了拨打电话的位置,但没有看到任何循环或其他东西。

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
            )
    }
}
Run Code Online (Sandbox Code Playgroud)

从日志打印

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
Run Code Online (Sandbox Code Playgroud)

拨电至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
    ) {...}
Run Code Online (Sandbox Code Playgroud)

onNavToHorario()

val actions  = MainActions(navController = navController)
(...)
onNavToHorario = actions.navigateToHorario
Run Code Online (Sandbox Code Playgroud)

MainActions()

class MainActions(navController: NavHostController){
    val navigateToHorario:(String) -> Unit = {nomHorario: String ->
        navController.navigate(route = MainDestinations.SCHEDULE_DETAILS_ROUTE+"/${nomHorario}")
    }
}
Run Code Online (Sandbox Code Playgroud)

在其他情况下,我遇到了类似的问题,并且发生了动画,但我已经删除了所有动画,NavGraph但问题仍然存在

ian*_*ake 12

导航总是交叉淡入淡出目的地,因此每个屏幕总是会多次重新组合。根据Thinking in Compose 指南,这是预期的:

在某些情况下,可组合函数可能会针对 UI 动画的每一帧运行。如果该函数执行昂贵的操作(例如从设备存储中读取),则该函数可能会导致 UI 卡顿。

您没有做任何错误(作为组合的一部分,您没有触发副作用),所以您的代码已经很好了。

  • 这就是“remember”的用途,根据[可组合项中的状态指南](https://developer.android.com/jetpack/compose/state#state-in-composables)。 (3认同)