如果我将 if 添加到可组合项中,则会出现无限循环重组

问题描述 投票:0回答:1

如果我添加一个 if 条件来导航到屏幕(如果表示当前部分的 int 参数已更改),则带有

navhost
的可组合项将在无限循环中重新组合。 条件没有改变,参数在每次重组中始终为1,但是如果我添加if,则可组合项会不断重组。如果我删除它,它只会重新组合一次。

我需要 if 的原因是因为外部事件(不在这个可组合项或其子项中)可以更改当前屏幕,并由名为

currentSectionId
的变量表示,该变量在父可组合项中从存储在另一个可组合项中的状态流中观察到类。

谁能解释一下无限循环?

@Composable
fun ApplicationNavHost(
    currentSectionId: Int,
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController()
) {
    val sections = SectionHolder.sections
    val startSection = SectionHolder.startSection

    NavHost(
        navController = navController,
        startDestination = startSection.toString(),
        modifier = modifier
    ) {
        for ((i, section) in sections.withIndex()) {
            Log.d("XXXX", "added route: $i")
            composable(route = i.toString()) {
                SectionComposableFactory(
                    section = section,
                )
            }
        }
    }

    if (currentSectionId != startSection.toInt()){
        navController.navigate(currentSectionId.toString())
        Log.d("XXXX", "new section: $currentSectionId")
    }
}
android kotlin android-jetpack-compose android-navigation compose-recomposition
1个回答
0
投票

通常导航应该是基于事件的。但在你的情况下, if 条件下的导航是一个副作用。在这种情况下,我们可以使用 Jetpack Compose 的一些副作用 API 来解决它:

// Use LaunchedEffect to perform navigation only when currentSectionId changes
LaunchedEffect(currentSectionId) {
    if (currentSectionId != startSection.toInt()) {
        navController.navigate(currentSectionId.toString())
        Log.d("XXXX", "new section: $currentSectionId")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.