Questão nº 62
Questão de Tecnologia da Informação - Programação · FGV DPE-RS 2023 (nº 62)
Atualmente a plataforma Android permite a separação entre o fluxo funcional das telas e os estados do sistema, por meio de estruturas do tipo ViewModel, que funcionam com base no padrão Observer. Considere a classe apresentada a seguir.
```java
public class NomeModel extends ViewModel {
private final MutableLiveData<String> nome =
new MutableLiveData<>("");
public LiveData<String> getNome() { return nome; }
public void setNome(String valor) { nome.setValue(valor); }
}
```
A classe NomeModel caracteriza-se por:
- Aviolar as regras de encapsulamento adotadas pela classe, ao utilizar o atributo interno nome, em getNome;
- Bgerenciar o atributo nome como um estado na Activity, bastando instanciar um objeto NomeModel com uso do operador new;
- Cmanter o valor interno inalterado no método setNome, apesar da chamada para setValue, já que o atributo foi definido como final;
- Dretornar um objeto LiveData, no método getNome, permitindo a alteração do valor de nome, ao nível da Activity, com a invocação do método setValue;
- Erequerer uma chamada para o método observe, no uso de getNome, com a passagem da referência para a Activity e de um operador lambda, efetuando a atualização da interface sempre que o valor interno for alterado. (alternativa correta)
Resposta comentada
Gabarito Alternativa E
O ViewModel é uma classe que armazena dados relacionados à interface do usuário de forma que sobrevivem a mudanças de configuração (como rotação de tela), e o LiveData é um tipo de dado que pode ser observado e que notifica automaticamente a interface quando seu valor muda, sendo consciente do ciclo de vida da tela.
(A) Incorreta: O método `getNome()` retorna um `LiveData<String>`, não um `MutableLiveData<String>`, o que impede a modificação direta do valor de `nome` a partir do exterior da classe, garantindo o encapsulamento.
(B) Incorreta: `ViewModel`s não devem ser instanciados diretamente com `new` em uma `Activity` se o objetivo é que sobrevivam a mudanças de configuração; eles são obtidos através de `ViewModelProvider` para serem gerenciados pelo framework Android.
(C) Incorreta: O modificador `final` em `nome` significa que a referência ao objeto `MutableLiveData` não pode ser alterada, mas o conteúdo (o valor `String` dentro do `MutableLiveData`) pode ser modificado através de métodos como `setValue()`.
(D) Incorreta: Esta é a armadilha. O método `getNome()` retorna um `LiveData<String>`, que não possui um método `setValue()` público. Apenas `MutableLiveData` tem `setValue()`. Isso é feito intencionalmente para que a `Activity` (ou `Fragment`) não possa alterar diretamente o estado, mas apenas observá-lo. As alterações devem ocorrer através dos métodos públicos do `ViewModel`, como `setNome()`.
(E) Correta: Para que a interface do usuário (UI) seja atualizada automaticamente quando o valor de `nome` mudar, é necessário "observar" o `LiveData` retornado por `getNome()`. Isso é feito chamando `getNome().observe(lifecycleOwner, observer)`, onde `lifecycleOwner` é a `Activity` ou `Fragment` e `observer` é um lambda que define como a UI deve reagir à mudança do valor.
Fonte: FGV DPE-RS 2023 Técnico - Apoio Especializado (Programador) (Caderno Tipo 1). Reproduzida para fins de estudo.