我正在try 执行一些列表操作,并且遇到了当单个项更新时所有项重新组合的问题.
我的模特们;
data class Person(val id: Int, val name: String, val isSelected: Boolean = false)
@Stable
data class PersonsWrapper(val persons: List<Person>)
我的视图模型和更新函数;
private val initialList = listOf(
Person(id = 0, name = "Name0"),
Person(id = 1, name = "Name1"),
Person(id = 2, name = "Name2"),
Person(id = 3, name = "Name3"),
Person(id = 4, name = "Name4"),
Person(id = 5, name = "Name5"),
Person(id = 6, name = "Name6"),
)
val list = mutableStateOf(PersonsWrapper(initialList))
fun updateItemSelection(id: Int) {
val newList = list.value.persons.map {
if (it.id == id) {
it.copy(isSelected = !it.isSelected)
} else {
it
}
}
list.value = list.value.copy(persons = newList)
}
和我的组合功能;
@Composable
fun ListScreen(personsWrapper: PersonsWrapper, onItemClick: (Int) -> Unit) {
LazyColumn(
verticalArrangement = Arrangement.spacedBy(2.dp),
modifier = Modifier.fillMaxSize()
) {
items(personsWrapper.persons, key = { it.id }) {
ListItem(item = it, onItemClick = onItemClick)
}
}
}
所有模型类在Compose_Reports中似乎都很稳定;
stable class Person {
stable val id: Int
stable val name: String
stable val isSelected: Boolean
<runtime stability> = Stable
}
stable class PersonsWrapper {
unstable val persons: List<Person>
}
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun ListScreen(
stable personsWrapper: PersonsWrapper
stable onItemClick: Function1<Int, Unit>
)
restartable skippable scheme("[androidx.compose.ui.UiComposable]") fun ListItem(
stable item: Person
stable onItemClick: Function1<Int, Unit>
)
当我想要更改列表中单个项目的选定状态时,整个列表将被重新组合.我还try 了使用kotlinx.Collection中的ImmuableList和Persistent List.但问题并没有得到解决.
在列表操作时如何避免不必要的重组?