【问题标题】:Composable in NavGraphBuilder is repeating 3 or more timesNavGraphBuilder 中的 Composable 重复 3 次或更多次
【发布时间】:2022-01-07 02:39:15
【问题描述】:

当我在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
            )
    }
}

从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

致电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}")
    }
}

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

【问题讨论】:

    标签: android kotlin navigation android-jetpack-compose


    【解决方案1】:

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

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

    你没有做错任何事(你不是 triggering side effects 作为组合的一部分),所以你的代码已经很好了。

    【讨论】:

    • 感谢您的回答,所以我在目的地中有一些变量,并且它们在每次重组时都会进行清理,我如何避免这种情况??
    • 这就是 remember 的用途,根据 State in composables guide
    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多