android - 为什么需要作者在这个@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
}
解决方案
您需要使用remember
来防止在重组期间重新计算。
您的示例在没有的情况下有效,remember
因为在您滚动浏览它时该视图不会重新组合。
但是如果你使用动画、添加状态变量或使用视图模型,你的视图可以被多次重组(当动画最多一帧时),在这种情况下,从存储库中获取数据将被重复多次,所以你需要用于remember
保存重组之间的计算结果。
因此,如果计算至少有点繁重,请始终remember
在视图构建器中使用,即使现在看起来视图不会被重新组合。
您可以在文档中阅读有关撰写状态的更多信息,包括这个 youtube 视频,它解释了基本原则。
推荐阅读
- angular - EventEmitter 不发出值
- php - 如何给用户无限的浏览量
- android - 支持库冲突并在android中给出dex合并问题
- python-2.7 - 客户地址字段为空时如何禁止打印发票
- javascript - 用 startdate 和 endate 列表填充 fullcalender
- c++ - 如何使用虚拟后缀运算符解决切片问题?
- python - 如何使用重命名功能
- reactjs - 动作可能没有未定义的“类型”属性。你在 reactjs,redux 中拼错了一个常量吗
- c# - Selenium Chrome 问题 - 显示警报时在 GoToUrl() 处停止执行
- regex - 从字符串中删除前导字母字符