首页 > 解决方案 > 为什么需要作者在这个@Composable 中添加关键字remember?

问题描述

代码 A 来自 ThemingCodelab 项目,您可以在此处查看完整代码。

我认为remember代码 A 中不需要关键字。

我已经测试了代码 B,似乎我可以得到与代码 A 相同的结果。

为什么需要作者remember在 this中添加关键字@Composable

代码 A

@Composable
fun Home() {
    val featured = remember { PostRepo.getFeaturedPost() }
    val posts = remember { PostRepo.getPosts() }
    MaterialTheme {
        Scaffold(
            topBar = { AppBar() }
        ) { innerPadding ->
            LazyColumn(contentPadding = innerPadding) {
                item {
                    Header(stringResource(R.string.top))
                }
                item {
                    FeaturedPost(
                        post = featured,
                        modifier = Modifier.padding(16.dp)
                    )
                }
                item {
                    Header(stringResource(R.string.popular))
                }
                items(posts) { post ->
                    PostItem(post = post)
                    Divider(startIndent = 72.dp)
                }
            }
        }
    }
}

代码 B

@Composable
fun Home() {
    val featured =PostRepo.getFeaturedPost() 
    val posts =  PostRepo.getPosts() 
    ...//It's the same with the above code
}

标签: androidandroid-jetpack-compose

解决方案


您需要使用remember来防止在重组期间重新计算。

您的示例在没有的情况下有效,remember因为在您滚动浏览它时该视图不会重新组合。

但是如果你使用动画、添加状态变量或使用视图模型,你的视图可以被多次重组(当动画最多一帧时),在这种情况下,从存储库中获取数据将被重复多次,所以你需要用于remember保存重组之间的计算结果。

因此,如果计算至少有点繁重,请始终remember在视图构建器中使用,即使现在看起来视图不会被重新组合。

您可以在文档中阅读有关撰写状态的更多信息,包括这个 youtube 视频,它解释了基本原则。


推荐阅读