Aqui está meu composível
@Composable
fun CounterScreen(viewModel: MyViewModel = viewModel()) {
val uiState by viewModel.uiState.collectAsState()
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = "Counter: ${uiState.count}")
Spacer(modifier = Modifier.height(16.dp))
FloatingActionButton(
onClick = {
viewModel.increment()
},
) {
Icon(imageVector = Icons.Default.Add, contentDescription = "Increment")
}
}
}
Por que o estado é preservado com recomposição quando escrevi fun CounterScreen(viewModel: MyViewModel = viewModel())
, mas não com fun CounterScreen(viewModel: MyViewModel = MyViewModel())
. No entanto, ambos criam uma nova instância de MyViewModel. Alguém pode me explicar? Obrigado
Dê uma olhada na documentação oficial da
viewModel()
função:Então, quando você usa
viewModel()
qualquer Composable no mesmo destinoActivity
//Fragment
,NavGraph
ele só criará uma nova instância na primeira vez, e todas as outras invocações retornarão a instância existente do ViewModel.Você deverá conseguir ver a diferença quando estender seu exemplo de código da seguinte maneira:
CounterScreenA
eCounterScreenB
agora compartilharão a mesma instância do ViewModel e usarão o mesmo contador. Se você substituirviewModel()
porMyViewModel()
, cada um deles terá seu próprio contador.Com
MyViewModel()
você sempre criamos uma nova instância.A
viewModel()
função, por outro lado, usa uma fábrica de modelos de visualização nos bastidores para obter uma instância. E essa fábrica fornece a mesma instância para o mesmo ViewModelStoreOwner. O último assume como padrãoLocalViewModelStoreOwner.current
.Até que isso mude, você sempre obterá a mesma instância. Da documentação: