Android Studio 如何启动内联 fun <T> key()?

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)

Phi*_*hov 5

来自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)