【问题标题】:Problem trying to optimize for recomposition尝试优化重组的问题
【发布时间】:2021-01-31 03:25:41
【问题描述】:

我正在尝试将一个相当复杂的 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 大师都可以帮助我理解为什么它没有跳过该重组?

【问题讨论】:

    标签: android android-jetpack-compose


    【解决方案1】:

    尝试将Image(bitmap = background) 放入单独的可组合函数中。或者将Canvas 移动到另一个函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多