这是我的应用程序中的可组合层次结构:
HorizontalPager
↪LazyVerticalGrid
↪PostItem
↪AsyncImage
DropdownMenu
↪DropdownMenuItem
当刷HorizontalPager
时,我的PostItem中的AsyncImage
正在重新组合。删除DropdownMenu
修复了这一问题,PostItem不再进行重新组合,并提供了所需的行为。
问题是,当我在HorizontalPager
中滑动时,FPS会大幅下降。为什么DropdownMenu
在滑动HorizontalPager
时会导致重新组合?
var showMenu by remember { mutableStateOf(false) }
DropdownMenu(
expanded = showMenu,
onDismissRequest = { showMenu = false }) {
DropdownMenuItem(onClick = {
}) {
Text(text = "Share")
}
}
不幸的是,如果没有看到更多显示结构其余部分的代码,很难确定您的问题是什么。
一个可能的答案是,您还没有对可组合函数进行足够的拆分。文档中几乎没有提到的是,许多内置Composables的content
部分是inline functions
,这意味着如果内容重新组合,父级也会重新组合。这是我能举的最简单的例子。
@Composable
fun foo() {
println("recompose function")
Box {
println("recompose box")
Column {
println("recompose column")
Row {
println("recompose row")
var testState by mutableStateOf("my text")
Button(
onClick = { testState = "new text" }
) {}
Text(testState)
}
}
}
}
输出为:重新组合函数再压缩箱再压缩柱重新组合行
这不仅重新组合了整个函数,还重新创建了testState
,使其永远不会更改值。
同样,这不是100%的问题,但我会研究一下。解决方案是将我的Row
和行内容拆分为它自己的可组合函数。