Um elemento que pode ser composto com a navhost
será recomposto em um loop infinito se eu adicionar uma condição if para navegar até uma tela se um parâmetro int que representa a seção atual tiver sido alterado. A condição não mudou, o parâmetro é sempre 1 em cada recomposição , mas o que pode ser composto está sendo recomposto constantemente se eu adicionar esse if. Se eu removê-lo, ele só será recomposto uma vez.
A razão pela qual preciso disso é porque um evento externo (não neste elemento que pode ser composto ou em seus filhos) pode alterar a tela atual e é representado por aquela variável chamada currentSectionId
que está sendo observada no elemento que pode ser composto pai a partir de um fluxo de estado armazenado em outra classe.
Alguém pode me explicar esse loop infinito?
@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")
}
}
Normalmente as navegações devem ser baseadas em eventos. Mas no seu caso, a navegação sob a condição if é um efeito colateral. Nesses casos, podemos resolver isso com algumas APIs de efeitos colaterais do Jetpack Compose: