navhost
如果我添加一个 if 条件,当表示当前部分的 int 参数发生更改时,导航到屏幕,则带有 的可组合项会无限循环地重新组合。条件没有改变,每次重新组合时参数始终为 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")
}
}
通常情况下,导航应该是基于事件的。但对于你的情况,if 条件下的导航是一种副作用。在这种情况下,我们可以使用 Jetpack Compose 的一些副作用 API 来解决这个问题: