代码A来自官方的示例项目这里。
代码B来自Android源代码。
我已经搜索了谷歌关于key函数的文章,但找不到更多的细节。
Android如何启动the inline fun <T> key()?为什么作者不能使用代码C直接启动?
码A
key(detailPost.id) {
LazyColumn(
state = detailLazyListState,
contentPadding = contentPadding,
modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxSize()
.notifyInput {
onInteractWithDetail(detailPost.id)
}
) {
stickyHeader {
val context = LocalContext.current
PostTopBar(
isFavorite = hasPostsUiState.favorites.contains(detailPost.id),
onToggleFavorite = { onToggleFavorite(detailPost.id) },
onSharePost = { sharePost(detailPost, context) },
modifier = Modifier.fillMaxWidth().wrapContentWidth(Alignment.End)
)
}
postContentItems(detailPost)
}
}码B
@Composable
inline fun <T> key(
@Suppress("UNUSED_PARAMETER")
vararg keys: Any?,
block: @Composable () -> T
) = block()代码C
LazyColumn(
state = detailLazyListState,
contentPadding = contentPadding,
modifier = Modifier
.padding(horizontal = 16.dp)
.fillMaxSize()
.notifyInput {
onInteractWithDetail(detailPost.id)
}
) {
stickyHeader {
val context = LocalContext.current
PostTopBar(
isFavorite = hasPostsUiState.favorites.contains(detailPost.id),
onToggleFavorite = { onToggleFavorite(detailPost.id) },
onSharePost = { sharePost(detailPost, context) },
modifier = Modifier.fillMaxWidth().wrapContentWidth(Alignment.End)
)
}
postContentItems(detailPost)
}发布于 2021-10-24 07:01:27
来自key文档:
key是一个可组合的实用工具,用于组合内部的执行块"group“或"key”。这有时是控制流内部的正确性所必需的,它可能导致给定的可组合调用在组合过程中执行不止一次。
它还包含了几个例子,因此看看这个。
这里是一个基本的例子,说明了它的用处。假设您具有以下可组合功能。我添加了DisposableEffect来跟踪它的生命周期。
@Composable
fun SomeComposable(text: String) {
DisposableEffect(text) {
println("appear $text")
onDispose {
println("onDispose $text")
}
}
Text(text)
}下面是用法:
val items = remember { List(10) { it } }
var offset by remember {
mutableStateOf(0)
}
Button(onClick = {
println("click")
offset += 1
}) {
}
Column {
items.subList(offset, offset + 3).forEach { item ->
key(item) {
SomeComposable(item.toString())
}
}
}我只显示两个列表项,并在每次单击按钮时移动窗口。
如果没有key,每次单击都会删除所有以前的视图并创建新视图。
但是使用key(item),只有消失的项目消失,仍然在屏幕上的项目被重用,而不需要重新组合。
以下是日志:
appear 0
appear 1
appear 2
click
onDispose 0
appear 3
click
onDispose 1
appear 4
click
onDispose 2
appear 5https://stackoverflow.com/questions/69670919
复制相似问题