2
respostas

Boas práticas ao utilizar os componentes

Minhas dúvidas são mais teóricas:

1- Quando utilizamos archtecture components, o correto seria eu tratar/formatar/mascarar os dados recebidos do repository na viewmodel, e repassa-los apenas para serem exibidos na activity/fragment, ou trata-los no repository mesmo?

2- A classe ViewModelProviders() está depreciada... pelo que pesquisei, deve-se utilizar a ViewModelProvider(). É isso mesmo?

3-Tem alguma forma da minha activity observar um livedata da minha viewmodel, e minha viewmodel observar outro livedata do meu repository para atualizar o que será retornado para a activity?

2 respostas

Olá,

Irei responder a Segunda Pergunta e as outras logo abaixo

2 - Sim, ele foi deprecated recentimente e o correto a se usar é :

ViewModelProvider(activity/fragment, factory).get(Activity/FragmentViewModel)

1 - Para a primeira pergunta :

Segundo o próprio site do Android Developers se diz: Visão geral do ViewModel


A classe ViewModel foi projetada para armazenar e gerenciar dados relacionados à IU considerando o ciclo de vida. A classe ViewModel permite que os dados sobrevivam às mudanças de configuração, como a rotação da tela.


Activity/Fragment mantém a mesma instância porém por alguma razão isso não se aplica aos dados, fazendo com que cada rotação uma nova busca seja efetuado.

Porém se todo esse gerenciamento de adição, remoção, atualização, leitura de dados fosse efetuado dentro do ViewModel, de fato iria se ter uma sobrecarga de trabalho dentro de uma classe, por isso o Repository.

Repository irá fazer a busca do RestApi e/ou Database interno(ROOM) passar pelo o MediatorLiveData e então retornar os dados em formato LiveData atualizados para o ViewModel que será responsável também em gerenciar o estado desses dados, retornando para a Activity/Fragment apenas aquilo que foi adicionado, alterado, removido e/ou atualizado.

Já respondendo a terceira pergunta, se tu usar o projeto de arquitetura MVVM ou MVI, se tem Estados(DataState e um ViewState) que observam esses valores por si só, então ao rotacionar não há uma captura de dados novamente pois esses já estão preenchidos nos states, e não há necessidade de criar um Observable dentro do ViewModel, apenas deixe esse trabalho para os States.

Caso tenha duvida sobre eles, tenho um exemplo usando o MVI:

class FragmentOneViewModel @Inject constructor(private val repository: Repository) : ViewModel() 

//Captura o ação do usuário ao que ele quer fazer
    private val _stateEvent: MutableLiveData<MainStateEvent> = MutableLiveData()

    //Configurando a ViewState
    private val _viewState: MutableLiveData<MainViewState> = MutableLiveData()

/**
mesma coisa que o getter ViewState :
fun getViewState()  : MutableLiveData<MainViewState>
return _viewState*/

    val viewState: MutableLiveData<MainViewState>
        get() = _viewState

// faz a busca dos dados no que apenas o usuario quis fazer.
    val dataState: LiveData<DataState<MainViewState>> = switchMap(_stateEvent) {
        when (it) {
            is MainStateEvent.GetPostEvent -> {
                repository.blogPosts()
            }

            is None -> {
                null
            }
        }
    }
}
class FragmentOne : DaggerFragment() {

 private fun subscribeObservers() {
        // carrega os dados do estado
        viewModel.dataState.observe(viewLifecycleOwner, Observer { dataState ->

            //se houver dados carrega, se nao, nao faz nada
            dataState.data?.let { 
             //adiciona os novos dados para o _viewState
        })

        viewModel.viewState.observe(viewLifecycleOwner, Observer { viewState ->
            viewState.post?.let {
        //adiciona os dados da _viewState para a view.
            } 
        })
    }
}

    private fun loadPosts() {
        framgnet_load_posts_button.setOnClickListener {
            viewModel.setStateEvent(MainStateEvent.GetPostEvent())
        }

    }

É realmente um pouco complicado essa questão de arquitetura, te aconselho a tirar uma boa parte do tempo para dar uma olhada, porém uma vez que sabe as coisas se tornam muito, mas muito fáceis.

Espero ter ajudado. Qualquer coisa estou disposto a tirar mais dúvidas.

Removido a pedido do usuario.