es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no se activa la recomposición en mi LazyColumn?

Tengo un LazyColumn que tiene varias listas que se supone que debe mostrar dependiendo del valor de index. Sin embargo, cuando cambio el valor de index, la lista cambia, pero los elementos no se vuelven a dibujar hasta que desplazo hacia abajo y vuelvo a subir. He intentado usar la palabra clave remember, cambiar mi lógica muchas veces y aún no se actualiza. Aquí están mis clases

La parte homepage[index] es la que quiero que active la recomposición. He intentado pasar la lista correcta en lugar de cambiar el índice, pero el resultado es el mismo. Supongo que estoy haciendo algo mal en mi uso de Compose, pero no puedo averiguar qué es.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la llamada itemsIndexed dentro de la función LazyColumnContent. Dado que se están pasando la lista homepage y index como parámetros, cualquier cambio en index no afectará la composición de LazyColumn.

    Para solucionarlo, puede crear una variable currentList que dependa del valor de index usando la función remember. De esta manera, cualquier cambio en index provocará una recomposición de LazyColumnContent, y se mostrará la lista correcta.

    Así es como se vería la función LazyColumnContent modificada:

    @Composable
    private fun LazyColumnContent(
        homepage: List<><moduleconfig>>,
        switcher: HomepageSwitcherTheme?,
        logo: HomepageThemeNavLogo?,
        index: Int = 0
    ) {
        LaunchedEffect(key1 = index) {
            updateHomepageSwitcher(switcher)
            updateNavigationBarLogo(logo)
        }
    
        val currentList = remember(index, homepage) { homepage[index] }
    
        LazyColumn(
            modifier = Modifier
                .fillMaxSize()
                .background(vennConfig.themeConfig.backgroundColor?.color)
        ) {
            itemsIndexed(currentList) { _, item ->
                AndroidView(
                    modifier = Modifier.fillMaxSize(),
                    factory = {
                        val productsInCategoryCriteriaSatisfied =
                            if (item.requiresProductsInCategoryId.isNullOrEmpty()) true
                            else categoryHasProducts[item.requiresProductsInCategoryId] ?: true
    
                        return@AndroidView if (productsInCategoryCriteriaSatisfied) moduleFactory.build(
                            item,
                            requireContext()
                        )
                        else View(context) // vista en blanco
                    }
                )
            }
        }
    }
    

    Al usar remember para crear la variable currentList, los parámetros index y homepage se convierten en dependencias del composable, y cualquier cambio en ellos provocará una recomposición.

Comments are closed.