Compose的Key(十三)

一、前言

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)
}

三、参考链接

  1. key

    https://developer.android.google.cn/reference/kotlin/androidx/compose/runtime/package-summary#key(kotlin.Array,kotlin.Function0)

  2. to

    https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/to.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值