LazyRow внутри вызова LazyColumn перекомпоновывается каждый раз

Привет, у меня есть объект со списком других объектов. Мне нужно показать список первого, а внутри каждого объекта показать горизонтальный список с другими объектами.

У меня эти объекты хранятся в локальной базе данных по комнатам. Эти объекты связаны перекрестной ссылкой:

      data class ObjectWithOtherObjectsCrossRef(
    @ColumnInfo(name = "object_id")
    val objectId: Long,
    @ColumnInfo(name = "other_object_id")
    val otherObjectId: Long,
)

У меня есть lazyRow внутри lazyColumn. LazyColumn заполняется комнатным потоком. В первый раз, когда я выхожу на экран, представление работает правильно, но когда я вставляю новый элемент, каждый раз вызывается перекомпоновка, и прокрутка замедляется.

Любая идея о том, почему recompose звонит каждый раз? Спасибо!

Вот мой код:

Модель данных:

      data class MyObject(
    val id: Long,
    val name: String,
    val list: List<OtherObject>
)

data class OtherObject(
    val id: Long,
    val name: String
)

UIState:

      sealed class MyObjectState {
    object Loading: MyObjectState()
    data class Success(val data: List<MyObject>): MyObjectState()
}

ViewModel:

      val uiState: StateFlow<MyObjectState> = getAllObjects().stateIn(
    scope = viewModelScope,
    started = SharingStarted.WhileSubscribed(5_000),
    initialValue = MyObjectState.Loading
)

fun addNewObject(object: Long, otherObject: Long) {
    viewModelScope.launch {
        addNewObjectUseCase(object, otherObject)
    }
}

Составной

      @Composable
fun MainView() {
    val state: MyObjectState by viewModel.uiState.collectAsState()

    when (state) {
        MyObjectState.Loading -> {...}
        is MyObjectState.Success -> ListScreen(state.data)
}



@Composable
fun ListScreen(
    val list: List<MyObject>
) {
    LazyColumn {
        items(
            items = list,
            key = { it.id }
        ) { 
            Text(text = it.name)
            LazyRow {
                items(
                    items = it.list,
                    key = { it.id },
                ) { 
                    Text(text = it.name)
                }
            }
        }
    }
}

1 ответ

Я попытался понизить версию Compose до стабильной (1.1.1), и она отлично работает.

Я использовал версию 1.2.0.beta02.

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