🚀 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
 
  1. Desacoplamento Total: A Activity não precisa mais implementar dezenas de interfaces de “Listener”.
  2. 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.
  3. 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 de this. 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.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️