微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试优化重组的问题

如何解决尝试优化重组的问题

我正在尝试将一个相当复杂的 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 举报,一经查实,本站将立刻删除。