Quero fazer uma solicitação de rede e mostrar os resultados da lista no Jetpack Compose. Passo os parâmetros da solicitação para o widget de lista. Mas o widget de lista não consegue recompor depois que o mapa foi alterado, mesmo adicionando um key
.
Abaixo está uma pequena demonstração: O valor int deve mudar após tocar no botão.
Por favor, ajude-me a consertar isso.
@Preview
@Composable
fun test() {
var map by remember { mutableStateOf(mapOf<String, Any>()) }
Column {
Button(
onClick = {
map = HashMap(map)
}
) {
Text(
text = "Tap"
)
}
key(map) { testWidget1(map = map) }
}
}
@Composable
fun testWidget1(map: Map<String, Any>) {
var testInt by remember { mutableStateOf(0) }
LaunchedEffect(map) {
testInt += 1
request()
}
Text(
text = "$testInt"
)
}
fun request() {
}
Existem dois problemas:
testWidget1
não é recomposto porque o mapa não muda. Embora você crie um novo objeto comHashMap(map)
, o Compose compara objetos por igualdade , não por identidade referencial . E isso significa que o conteúdo real do mapa precisa mudar para que o Compose o detecte como algo diferente. Esse não é o caso no seu exemplo.Ao usar,
key
você diz explicitamente ao Compose para descartar o estado antigotestWidget1
e criar um novo sempre que houvermap
alterações. Portanto, mesmo quemap
isso mude, você ainda redefiniriatestInt
a cada vez, começando do 0 (e definindo-o como 1 no LaunchedEffect). Normalmente, você não precisakey
de um composable comum. Basta removê-lo e chamartestWidget1(map = map)
diretamente.Objetivo:
O objetivo era atualizar um valor inteiro ao tocar em um botão e garantir que a IU (especificamente
testWidget1
) respondesse adequadamente.Problema identificado:
a cada clique de botão, o mapa estava sendo substituído por uma nova
HashMap
instância em vez de atualizar a existente. Como resultado,testWidget1
não estava sendo recomposto, pois a recomposição depende da observação de alterações no próprio objeto do mapa.Solução implementada:
Para resolver esse problema, modifiquei a lógica para atualizar o mapa existente em vez de reatribuí-lo. Introduzi um contador que aumenta a cada clique de botão. Esse contador é usado para gerar e inserir um novo par chave-valor no mapa existente.
Ao atualizar o mapa no local — mantendo as entradas existentes —
testWidget1
agora detecta as alterações e recompõe com os novos valores.Cada clique adiciona novas entradas como
key1
,key2
,key3
e assim por diante, o que garante que o mapa seja modificado de forma consistente e acione as atualizações esperadas da interface do usuário.