Compartilhando dados entre fragmentos usando o novo componente de arquitetura ViewModel

No último Google IO, o Google lançou uma prévia de alguns novos componentes de arco, um dos quais, o ViewModel.

Nodocs O google mostra um dos possíveis usos para este componente:

É muito comum que dois ou mais fragmentos de uma atividade precisem se comunicar. Isso nunca é trivial, pois os dois fragmentos precisam definir alguma descrição da interface e a atividade do proprietário deve unir os dois. Além disso, os dois fragmentos devem lidar com o caso em que o outro fragmento ainda não foi criado ou não está visível.

Esse ponto problemático comum pode ser resolvido usando objetos ViewModel. Imagine um caso comum de fragmentos de detalhes mestre, em que temos um fragmento no qual o usuário seleciona um item de uma lista e outro fragmento que exibe o conteúdo do item selecionado.

Esses fragmentos podem compartilhar um ViewModel usando seu escopo de atividade para lidar com essa comunicação.

E mostra um exemplo de implementação:

public class SharedViewModel extends ViewModel {
    private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

    public void select(Item item) {
        selected.setValue(item);
    }

    public LiveData<Item> getSelected() {
        return selected;
    }
}

public class MasterFragment extends Fragment {
    private SharedViewModel model;
    public void onActivityCreated() {
        model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        itemSelector.setOnClickListener(item -> {
            model.select(item);
        });
    }
}

public class DetailFragment extends LifecycleFragment {
    public void onActivityCreated() {
        SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
        model.getSelected().observe(this, { item ->
           // update UI
        });
    }
}

Fiquei bastante empolgado com a possibilidade de não precisar das interfaces usadas pelos fragmentos para se comunicar através da atividade.

Mas o exemplo do Google não mostra exatamente como eu chamaria o fragmento de detalhe do mestre.

Eu ainda teria que usaruma interface isso será implementado pela atividade, que chamará fragmentManager.replace (...), ou existe outra maneira de fazer isso usando a nova arquitetura?

questionAnswers(6)

yourAnswerToTheQuestion