I was curious why
drawIntoCanvas { it.nativeCanvas.drawRenderNode(...) }
wasn't drawing anything. Turns out you need to call
RenderNode.setPosition()
before drawing! So a nice cached render modifier for API >= 29 is:
fun Modifier.drawCached(): Modifier = drawWithCache {
val width = size.width.roundToInt()
val height = size.height.roundToInt()
val renderNode = RenderNode("drawCached")
renderNode.setPosition(0, 0, width, height)
onDrawWithContent {
val recordingCanvas = renderNode.beginRecording(width, height)
draw(this, layoutDirection, Canvas(recordingCanvas), size) {
this@onDrawWithContent.drawContent()
}
renderNode.endRecording()
drawIntoCanvas { it.nativeCanvas.drawRenderNode(renderNode) }
}
}
This works well for expensive composables in lazy layouts like HorizontalPager, e.g. when layering several layouts in the child pages.