1
resposta

Entender melhor a criação do HomeScreenUiState na MainActivity

Olá pessoal!

Na aula o Alex demonstrou sobre a importância de criar o HomeScreenUiState na MainActivity pelo fato de podermos ter o estado salvo quando houver a recomposição. Mas fiquei com uma dúvida e queria entender de forma mais técnica. Não entra na minha mente o por que de ter que criar esse estado. Sem ele realmente o estado não se mantem, isso é visível na aula. Mas vamos supor que não criei uma instância la na MainActivity, ai a HomeScreen vai criar a instância default para HomeScreenUiState que está presente no construtor

@Composable
fun HomeScreen(
    sections: Map<String, List<Product>>,
    state: HomeScreenUiState = HomeScreenUiState()
) {
....
}

Quando houvesse a recomposição não era para manter a instância default criada anteriormente? Por que isso não ocorre no compose?

Obs: Eu fiz um debug aqui no ponto que ele cria a HomeScreen na MainActivity e verifiquei que não é criado uma nova instância de HomeScreen quando tem a recomposição, por isso fiquei com essa dúvida, se não há criação de nova instância de HomeScreen, não era para estar criando uma instância nova de HomeScreenUiState

1 resposta

Olá, Matheus!

Sua dúvida é bastante relevante e mostra que você está realmente se aprofundando no conteúdo, o que é ótimo!

A questão que você levantou é sobre a persistência do estado durante a recomposição no Jetpack Compose. O Jetpack Compose usa a recomposição para atualizar a interface do usuário quando há mudanças de estado. No entanto, durante essa recomposição, os estados que não estão sendo "lembrados" (ou seja, que não estão sendo gerenciados por um remember) são redefinidos para seus valores padrão. Isso é o que está acontecendo com o HomeScreenUiState em seu caso.

Quando você define o HomeScreenUiState na MainActivity e o passa para a HomeScreen, você está efetivamente movendo a responsabilidade de manter o estado para fora da HomeScreen. Isso significa que, mesmo que a HomeScreen seja recomposta, o estado será mantido na MainActivity e, portanto, será preservado.

Por outro lado, quando você não passa um HomeScreenUiState para a HomeScreen e permite que ele crie seu próprio estado padrão, esse estado é "esquecido" sempre que a HomeScreen é recomposta. Isso ocorre porque a HomeScreen está sendo recomposta, mas o estado que ela criou não está sendo "lembrado" em nenhum lugar. Portanto, a cada recomposição, um novo HomeScreenUiState é criado com os valores padrão.

Espero que isso esclareça sua dúvida. A chave aqui é entender que a recomposição no Jetpack Compose não preserva automaticamente o estado, e é por isso que precisamos usar construções como remember para garantir que o estado seja mantido através das recomposições.

Espero ter ajudado e bons estudos!