Как распространять Livedata из репозитория> ViewModel> Fragment - PullRequest
0 голосов
/ 13 сентября 2018

getMoreData() во ViewModel вызывается из-за пределов ViewModel, каждый раз, когда пользователь прокручивает до конца RecyclerView.

fetchMore() в репозитории возвращает LiveData с объектом LoadingStatus, который содержит сообщение о загрузке / успехе / сбое и сообщении об ошибке

Как установить переменную loadingStatus в ViewModel, чтобы она моглабыть правильно осмотренным фрагментом?

Примечание: getMoreData() в ViewModel может вызываться несколько раз при прокрутке пользователя вниз.

ViewModel{
    val loadingStatus

    fun getMoreData(){
        repository.fetchMore()
    }
}

Repository{
    fun fetchMore() : LiveData<LoadingStatus>{

    }
}

Fragment{
    viewModel.loadingStatus.observe()
}

1 Ответ

0 голосов
/ 17 января 2019

Проблема связана с необходимостью владельца жизненного цикла , используемого для наблюдений за LiveData в репозитории.

Во-первых, вы не хотите возвращать новый LiveData<LoadingStatus> каждый раз, когда вызывается fetchMore(). Это будет создавать новые LiveData каждый раз. В лучшем случае вы бы хотели, чтобы функция fetchMore() выполняла что-то вроде этого, обновляя одну LiveData:

Repository{
    val status = LiveData<LoadingStatus>()

    fun fetchMore() {
        status.postValue(LOADING)

        // Pseudo code for actually loading more items

        status.postValue(FINISHED LOADING)
    }
}

Однако у вас возникнет проблема наблюдения status с ViewModel, поскольку он сам не является реализацией жизненного цикла, поэтому он не может легко наблюдать LiveData из репозитория.

Мое предложение будет примерно таким:

ViewModel{
    val loadingStatus: MutableLiveData<LoadingStatus>

    init{
        repository.observeStatus()
            .subscribe( event -> loadingStatus.postValue(event))
    }

    fun getMoreData(){
        repository.fetchMore()
    }
}

Repository{
    val status = BehaviorSubject.create<LoadingStatus>()

    fun observeStatus(): Observable<LoadingStatus> {
        return status
    }

    fun fetchMore(){
        status.onNext(LOADING)

        // Pseudo code for actually loading more items

        status.onNext(FINISHED LOADING)
    }
}

Fragment{
    viewModel.loadingStatus.observe()
}

Обратите внимание, что вам придется избавиться от подписки в ViewModel onCleared.
Обратите внимание, что все это псевдокод, и его следует делать намного чище, чем этот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...