Sou novo no Kotlin e no Jetpack Compose e tenho um problema no meu aplicativo Android. Ao executar o código abaixo, posso pressionar o botão "Aumentar" e o Canvas mostra o número aumentado. Porém, no pointerInput
onTap
caso, o número é sempre 1. Somente quando forço uma recomposição girando o dispositivo é que o novo número é utilizado.
Parece que o estado é usado quando foi composto pela primeira vez, em vez do estado atual. Como posso usar o estado mais recente do onTap
evento?
Algumas informações básicas: eu uso o Canvas para desenhar uma grade com um número dinâmico de colunas e linhas. O número no meu exemplo determina o número de colunas ou linhas. Caso onTap
eu queira calcular qual célula foi clicada, para gerar meu próprio onCellTap
evento. Faço isso usando a fórmula para calcular a posição das células usadas onDraw
, mas ao contrário. Tudo isso funciona bem, até que uma coluna ou linha seja adicionada dinamicamente, porque não consigo calcular com a contagem de colunas "antigas".
Em vez de mutableIntStateOf
neste exemplo, eu uso um ViewModel
em meu aplicativo. Removi isso do exemplo para simplificar, espero que isso não importe.
@Composable
fun TopLevelComposable(modifier: Modifier = Modifier) {
var number by rememberSaveable { mutableIntStateOf(0) }
Column {
TestCanvasComposable(number)
Button(onClick = {
number += 1
}) {
Text(
text = "Increase",
modifier = modifier
)
}
}
}
@Composable
fun TestCanvasComposable(
number: Int,
modifier: Modifier = Modifier
) {
val textMeasurer = rememberTextMeasurer()
Canvas(modifier = modifier
.fillMaxWidth()
.height(30.dp)
.pointerInput(Unit) {
detectTapGestures(
onTap = {
// This does not show the correct number:
Log.i("Test", "The number is $number")
}
)
}, onDraw = {
drawRect(Color.Yellow, Offset.Zero, this.size)
drawText(
textMeasurer = textMeasurer,
text = buildAnnotatedString {
withStyle(ParagraphStyle(textAlign = TextAlign.Start)) {
// This works perfectly:
append("The number is: $number")
}
}
)
}
)
}
Tentei remover o TestCanvasComposable
Composable e apenas colocar o código do Canvas no arquivo TopLevelComposable
. Após essa alteração, funciona bem. Mas eu gostaria de mantê-los separados para possível reutilização.
Você está perdendo o estado porque quando
@Composable
recompõe ele redefine o valor do número.Você pode usar
rememberUpdatedState
para rastrear alteraçõesnumber
eremember
o último número atualizado.Está funcionando Verifique este código