Доступ к полю 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? статья Бена Тренгроува