Compose-DropDownMenu导致不需要的重新组合



这是我的应用程序中的可组合层次结构:

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和行内容拆分为它自己的可组合函数。

相关内容

  • 没有找到相关文章

最新更新