Hel*_*oCW 4 android kotlin android-jetpack-compose
代码 A 来自此处的官方示例项目。
代码B来自Android Studio源代码。
我在Google上搜索了有关该功能的文章key
,但找不到更多详细信息。
Android Studio 如何启动the inline fun <T> key()
?为什么作者不能直接使用Code 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)
}
}
Run Code Online (Sandbox Code Playgroud)
代码B
@Composable
inline fun <T> key(
@Suppress("UNUSED_PARAMETER")
vararg keys: Any?,
block: @Composable () -> T
) = block()
Run Code Online (Sandbox Code Playgroud)
代码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)
}
Run Code Online (Sandbox Code Playgroud)
来自key
文档:
key
是一个实用程序可组合项,用于对组合内部的执行块进行“分组”或“键控”。有时,为了控制流内部的正确性,这可能会导致给定的可组合调用在组合期间执行多次。
它还包含几个示例,因此请查看。
这是它的用处的一个基本示例。假设您有以下可组合项。我添加了DisposableEffect
跟踪其生命周期的功能。
@Composable
fun SomeComposable(text: String) {
DisposableEffect(text) {
println("appear $text")
onDispose {
println("onDispose $text")
}
}
Text(text)
}
Run Code Online (Sandbox Code Playgroud)
这是用法:
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())
}
}
}
Run Code Online (Sandbox Code Playgroud)
我只显示两个列表项,并在每次单击按钮时移动窗口。
如果没有key
,每次单击都会删除所有以前的视图并创建新视图。
但是使用 时key(item)
,只有消失的项目才会消失,而仍在屏幕上的项目将被重新使用而无需重新组合。
这是日志:
appear 0
appear 1
appear 2
click
onDispose 0
appear 3
click
onDispose 1
appear 4
click
onDispose 2
appear 5
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
253 次 |
最近记录: |