Доступ к полю layoutInfo из LazyListState приводит к бесконечной перекомпоновке компонуемого объекта.

Вот пример:

      @Composable
fun MyList(items: List<Item>) {
    val lazyListState = rememberLazyListState()

    lazyListState.layoutInfo // Accessing this field causes MyList to recompose infinitely

    LazyColumn(state = lazyListState) {
        itemsIndexed(items) { _, item ->
            MyItem(item)
        }
    }
}

Почему доступlayoutInfoпричиныMyListбесконечно пересобирать? Что я здесь делаю неправильно?

1 ответ

Вы должны использовать его внутри производногоStateOf, чтобы реагировать, когда любое состояние, которое вы читаете, часто изменяется, особенно больше, чем перекомпоновка, или вызывать перекомпоновку в каждом кадре, когда вы читаете из него.

val myState = запомнить {derivedStateOf { lazyListState.lazyLayoutInfo // доступ к свойствам} }

как вы можете видеть в предупреждении в

Также еще один вариант, предлагаемый студией Android, - использовать SnapshotFlow как

      LaunchedEffect(lazyListState) {
        snapshotFlow { lazyListState.layoutInfo }
            .collect { TODO("Collect the state") }
    } 

Вы можете проверить Jetpack Compose — Когда я должен использовать производноеStateOf? статья Бена Тренгроува