Сначала я отвечу на ваш общий вопрос:
И вообще, куда мне поместить переменную LiveData / MutableLiveData и почему?
Краткий ответ:это зависит.Обычно, если вы работаете только с LiveData, вы передаете LiveData, полученную из вашего хранилища, прямо в ViewModel, а ViewModel просто предоставляет его представлению View, без необходимости создавать его экземпляр во ViewModel.
Но, если по какой-либо причине вам нужно изменить LiveData в ViewModel, вы должны сохранить ссылку на него в ViewModel, вы можете ясно увидеть это в этом примере Google :
public LiveData<ProductEntity> loadProduct(final int productId) {
return mDatabase.productDao().loadProduct(productId);
}
Репозиторий просто получает LiveData, предоставленный библиотекой комнат, и предоставляет его.Модель View получает LiveData и предоставляет его представлению:
public ProductViewModel(@NonNull Application application, DataRepository repository,
final int productId) {
super(application);
mProductId = productId;
mObservableProduct = repository.loadProduct(mProductId);
}
public LiveData<ProductEntity> getObservableProduct() {
return mObservableProduct;
}
Вы можете удерживать ссылку на результат LiveData, как показано выше.Но вы могли бы передать это прямо в представление:
public LiveData<ProductEntity> getObservableProduct() {
return repository.loadProduct(mProductId);
}
В последнее время я вижу, что если вы работаете с Retrofit и удаленным репозиторием (или даже с Room), вы можете работать с RxJava(или собственные обратные вызовы Retrofit) и таким образом вам понадобится экземпляр LiveData в вашей ViewModel.
Таким образом, разница в том, что если вы работаете только с LiveData (из источника данных в представление), вы можете хранить ссылку на ваши текущие данные в ViewModel.Если вы работаете на полпути только у вас , вы должны иметь LiveData в модели представления.
Наконец, в вашем случае вы можете держать ссылку, как в примере Google.