首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android如何启动内联<T>键()?

Android如何启动内联<T>键()?
EN

Stack Overflow用户
提问于 2021-10-22 03:01:20
回答 1查看 151关注 0票数 0

代码A来自官方的示例项目这里

代码B来自Android源代码。

我已经搜索了谷歌关于key函数的文章,但找不到更多的细节。

Android如何启动the inline fun <T> key()?为什么作者不能使用代码C直接启动?

码A

代码语言:javascript
复制
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

代码语言:javascript
复制
@Composable
inline fun <T> key(
    @Suppress("UNUSED_PARAMETER")
    vararg keys: Any?,
    block: @Composable () -> T
) = block()

代码C

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-24 07:01:27

来自key文档:

key是一个可组合的实用工具,用于组合内部的执行块"group“或"key”。这有时是控制流内部的正确性所必需的,它可能导致给定的可组合调用在组合过程中执行不止一次。

它还包含了几个例子,因此看看这个

这里是一个基本的例子,说明了它的用处。假设您具有以下可组合功能。我添加了DisposableEffect来跟踪它的生命周期。

代码语言:javascript
复制
@Composable
fun SomeComposable(text: String) {
    DisposableEffect(text) {
        println("appear $text")
        onDispose {
            println("onDispose $text")
        }
    }
    Text(text)
}

下面是用法:

代码语言:javascript
复制
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),只有消失的项目消失,仍然在屏幕上的项目被重用,而不需要重新组合。

以下是日志:

代码语言:javascript
复制
appear 0
appear 1
appear 2
click
onDispose 0
appear 3
click
onDispose 1
appear 4
click
onDispose 2
appear 5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69670919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档