Переменная LiveData члена экземпляра в ViewModel? - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь понять компоненты архитектуры Android после нескольких лет перерыва на Android.Одна вещь, которая меня смущает после прочтения официальной документации и нескольких блогов, это то, где создавать переменные LiveData.

В первом варианте ниже я создал переменную livingata только в классе репозитория и во втором варианте в обоих репозиториях.и просмотр модели класса.Оба варианта работают.

Первый вариант:

public class ScoreViewModel extends AndroidViewModel {

    private ScoreRepositorDB scoreRepo;

    public ScoreViewModel(Application application) {
        super(application);
        scoreRepo = new ScoreRepositorDB(application);
    }

    public LiveData<Score> getScore(){
        return scoreRepo.getScore();   
    }
    ...
 }

Второй вариант:

public class ScoreViewModel extends AndroidViewModel {

    private ScoreRepositorDB scoreRepo;
    private LiveData<Score> score ;

    public ScoreViewModel(Application application) {
        super(application);
        scoreRepo = new ScoreRepositorDB(application);
        score =  scoreRepo.getScore();
    }

    public LiveData<Score> getScore(){
       // return scoreRepo.getScore();
       return score;

    }
    ...
  }

Хранилище для обоих вариантов:

private LiveData<Score> score ;

ScoreRepositorDB(Application application) {
    ScoreRoomDatabase db = ScoreRoomDatabase.getDatabase(application);
    scoreDao = db.scoreDao();
    score = scoreDao.getScore(1);
}

public LiveData<Score> getScore(){
    return score;
}
...

Вэтот пример, я должен создать:

 private LiveData<Score> score ;

в ViewModel?И вообще, где я должен поместить экземпляр переменной LiveData / MutableLiveData и почему?

1 Ответ

0 голосов
/ 18 июня 2018

Сначала я отвечу на ваш общий вопрос:

И вообще, куда мне поместить переменную 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.

...