一、前言
在Compose
中状态的改变会促使调用点的组合发生重组,但是有时候重组会发生在我们并不想重组的地方。常见的比如列表,如果其中一个item数据发生改变导致整个列表重组那么会是很大的问题,因此这时候就需要使用key来解决这个问题,例如
@Composable
fun MessageList(messages: List<Message>) {
LazyColumn {
items(
items = messages,
key = { message ->
// Return a stable + unique key for the item
message.id
}
) { message ->
MessageRow(message)
}
}
}
二、key
key
是一种可组合的实用程序,用于“group”或“key”组合内的执行块。这有时需要控制流内部的正确性,这可能导致给定的可组合调用在组合期间执行多次。
键的值不需要是全局唯一的,只需要在组合key
中那个点的调用中是唯一的。
代码定义如下
@Composable
inline fun <T : Any?> key(keys: vararg Any?, block: () -> T): @Composable T
1、简单结构的单一key
import androidx.compose.runtime.key
for (user in users) {
key(user.id) { UserPreview(user = user) }
}
for (user in users.filter { isAdmin }) {
key(user.id) { Friend(friend = user) }
}
2、复杂对象的单一key
import androidx.compose.runtime.key
for ((child, parent) in relationships) {
key(parent.id to child.id) {//to 表示组成一个Pair<A,B>结构
User(user = child)
User(user = parent)
}
}
3、组合key
如果对象有多个约束条件的话可以使用这种
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
for (element in elements) {
val selected by key(element.id, parentId) { remember { mutableStateOf(false) } }
ListItem(item = element, selected = selected)
}