如何解决尝试优化重组的问题
我正在尝试将一个相当复杂的 Android 视图移植到 Compose 中,并且通过基本上使用 Canvas 并将 onDraw() 代码移到那里,我设法完成了一个简单的实现。在尝试优化它以使其跳过重组中不需要的部分时,我遇到了问题。
视图是围棋游戏的棋盘(国际象棋也是如此)。我试图让诸如董事会背景之类的东西在每次移动时不重绘,因为背景不会改变。由于我对文档的理解是,如果我从 onDraw 中拉出 drawBackground()
并将其放入一个 Image()
可组合中,那么 Image()
可组合不应该被重新组合,除非它的参数(这是只是位图)变化。但是,断点显示每次位置发生变化时都会调用该方法(例如玩家移动)。难道我做错了什么?我如何在这里利用 Compose?
代码:
@Composable
fun Board(modifier: Modifier = Modifier,boardSize: Int,position: Position?,candidateMove: Point?,candidateMoveType: StoneType?,onTapMove: ((Point) -> Unit)? = null,onTapUp: ((Point) -> Unit)? = null) {
val background: ImageBitmap = imageResource(id = R.mipmap.texture)
Box(modifier = modifier
.fillMaxWidth()
.aspectRatio(1f)
) {
Image(bitmap = background) // Expecting this to run only once,but gets run every time Board() gets recomposed!!!
var width by remember { mutableStateOf(0) }
val measurements = remember(width,boardSize) { doMeasurements(width,boardSize,drawCoordinates) }
var lastHottrackedPoint: Point? by remember { mutableStateOf(null) }
Canvas(modifier = Modifier.fillMaxSize()) {
if (measurements.width == 0) {
return@Canvas
}
//... lots of draw code here
}
}
}
任何 Jetpack Compose 专家都可以帮助我理解为什么不跳过重新组合?
解决方法
尝试将 Image(bitmap = background)
放在单独的可组合函数中。或者将 Canvas
移动到另一个函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。