🚀 8.5 Comunicação de Elite com Shared ViewModel
Antigamente, a única forma de fazer dois Fragments conversarem era através de interfaces complexas e “Callbacks” na Activity. Na Engenharia Premium, utilizamos o Shared ViewModel, que atua como uma ponte de dados inteligente e persistente entre os componentes.
O Conceito de Shared ViewModel
O ViewModel é “escopado” à Activity. Isso significa que todos os Fragments dentro dessa Activity podem acessar a mesma instância do ViewModel, compartilhando dados de forma reativa sem que um precise conhecer a existência do outro.
1. Criando o ViewModel (Java 17)
public class SharedViagemViewModel extends ViewModel {
private final MutableLiveData<Long> viagemSelecionadaId = new MutableLiveData<>();
public void selecionarViagem(long id) {
viagemSelecionadaId.setValue(id);
}
public LiveData<Long> getViagemSelecionadaId() {
return viagemSelecionadaId;
}
}2. Enviando Dados (Fragment Lista)
// No clique do item
var viewModel = new ViewModelProvider(requireActivity()).get(SharedViagemViewModel.class);
viewModel.selecionarViagem(viagem.getId());3. Recebendo Dados (Fragment Detalhes)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
var viewModel = new ViewModelProvider(requireActivity()).get(SharedViagemViewModel.class);
// Observa mudanças: quando a lista mudar, os detalhes atualizam automaticamente!
viewModel.getViagemSelecionadaId().observe(getViewLifecycleOwner(), id -> {
carregarDadosDaViagem(id);
});
}
## Vantagens da Engenharia Premium
- Desacoplamento Total: A Activity não precisa mais implementar dezenas de interfaces de “Listener”.
- Sobrevivência a Rotações: Se o usuário girar o tablet, o ViewModel mantém os dados, evitando que a seleção se perca.
- Reatividade: A UI reage aos dados (Data-Driven), reduzindo bugs de estado inconsistente.
IMPORTANT
getViewLifecycleOwner(): Ao observar LiveData dentro de um Fragment, utilize sempre o
getViewLifecycleOwner()em vez dethis. Isso garante que a observação seja removida automaticamente quando a View do Fragment for destruída, evitando vazamentos de memória.
TIP
No Java 17, o uso de Lambdas para os observadores de LiveData torna o código extremamente conciso e focado na intenção de negócio, eliminando o “boilerplate” de classes anônimas.