Вызовы LazyColumn и error @Composable могут происходить только в контексте функции @Composable

У меня есть Composable, который показывает для каждой категории строку с раскрывающимся списком и т. д., и когда я пытаюсь создать категорию Foreach, создайте строку в приложении, чтобы люди могли щелкнуть и выбрать уровень, который показывает ошибку Composable. Вызовы @Composable могут происходить только из контекст функции @Composable

уровни Содержит список категорий

    LazyColumn(
                 modifier = Modifier.fillMaxWidth(),
                 verticalArrangement = Arrangement.spacedBy(8.dp)
              ) {
                 levels?.forEach { category ->
                     CategoryItem(category) //Error happens here
                }
            }
*emphasized text*

Вот что делает CategoryItem:

@Composable
    fun CategoryItem(category: Category) {
        var expanded by remember { mutableStateOf(false) }

        Column(
            modifier = Modifier
                .fillMaxWidth()
                .padding(horizontal = 16.dp)
        ) {
            ClickableSquare(
                onClick = { expanded =!expanded },
                text = category.name
            )

            if (expanded) {
                DropdownMenu(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(horizontal = 16.dp),
                    expanded = expanded,
                    onDismissRequest = { expanded = false }
                ) {
                    category.levels.forEach { level ->
                        DropdownMenuItem(
                            text = { Text(text = level.name) },
                            onClick = {
                                // Navigate to GameScreen with level data
                                navController.navigate(route = AppScreens.GameScreen.route + "/${level.code}")
                            }
                        )
                    }
                }
            }
        }
    }
1
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С помощью LazyColumn вы не можете использовать обычный цикл для создания элементов пользовательского интерфейса. Вместо этого вам нужно использовать LazyListScope DSL, например функции item() и items(). Вот пример:

LazyColumn(
    modifier = Modifier.fillMaxWidth(),
    verticalArrangement = Arrangement.spacedBy(8.dp)
) {
    items(levels) {
        CategoryItem(it)
    }
}

Кроме того, важно использовать ключевой параметр в функции items(), особенно если порядок элементов вашего списка можно изменить.

LazyColumn(
    modifier = Modifier.fillMaxWidth(),
    verticalArrangement = Arrangement.spacedBy(8.dp)
) {
    items(
        items = levels,
        key = { it.id }
    ) { level ->
        CategoryItem(level)
    }
}

здесь написано, что «Невозможно найти параметр с таким именем: элементы в «предметах = уровнях». Им что-то не хватает?

Ángel David Gutierrez Orellana 10.06.2024 01:23

Во время ввода обязательно выберите функцию items(List<T> items, ...) в контекстной помощи. Также проверьте, что вы импортировали import androidx.compose.foundation.lazy.items.

BenjyTec 10.06.2024 08:31

Другие вопросы по теме