💡A Solução: Versões Lambda de Modificadores
Ambos Modifier.offset e Modifier.graphicsLayer têm versões lambda:
@Composable
fun SwipeableCard(state: SwipeableCardState) {
Card(
modifier = Modifier
.offset {
IntOffset(
x = state.offset.x.roundToInt(),
y = state.offset.y.roundToInt()
)
}
.graphicsLayer {
scaleX = state.scaleFactor
scaleY = state.scaleFactor
}
)
}A diferença é sutil, mas significativa. As versões lambda adiam a leitura do estado. O Compose não lê state.offset durante a composição — ele o lê mais tarde, na fase de Layout ou Drawing, dentro da lambda.
Isso significa que quando o deslocamento muda:
✅ O Compose pula a composição inteiramente
✅ O Compose pula o Layout (para graphicsLayer)
✅ Apenas o Drawing é executado
Para uma carta sendo arrastada pela tela a 60–120fps, isso é uma vitória significativa.
Por Que Isso Funciona?
O Compose rastreia leituras de estado por escopo. Quando você lê um valor de estado, o Compose registra o escopo atual como observador desse estado. Quando o estado muda, apenas o escopo registrado re-executa.
Modificadores lambda criam seu próprio escopo apertado, apenas o corpo da lambda. Então quando o estado de deslocamento muda, apenas essa lambda é re-executada, não toda a árvore composta acima dela.

