RoboSwag/lifecycle-rx
Alemoore 7ed7a25bfe add TestableLiveDataDispatcher without android classes 2022-03-02 16:23:24 +03:00
..
src/main add TestableLiveDataDispatcher without android classes 2022-03-02 16:23:24 +03:00
.gitignore Migration to single repo 2018-09-27 13:52:59 +03:00
README.md Fix submodules' READMEs 2019-09-10 13:58:03 +03:00
build.gradle fix errors from wrong gradle setup in new modules 2020-09-09 16:50:32 +03:00

README.md

lifecycle-rx

Модуль для преобразования событий из Observable в LiveData. Нужен для передачи событий из ViewModel во ViewController с автоматическим управлением подписками во ViewController.

Основный интерфейсы и классы

Destroyable - интерфейс, который содержит extansion-функцию untilDestroy для Flowable, Observable, Single, Completable, Maybe. Данная функция гарантирует, что подписка на события "умрет" после onDestroy.

LifeDataDispatcher - интерфейс, описывающий функцию dispatchTo для преобразования Observable в MutableLiveData.

BaseDestroyable и BaseLifeDataDispatcher - базовые реализации Destroyable и LifeDataDispatcher соответсвенно.

RxViewModel - базовый класс, от которого должны наследоваться все ViewModel. Обеспечивает отписку всех подписчиков при возникновении onCleared. Реализует BaseDestroyable и LiveDataDispatcher. По умолчанию использует базовые реализации данных интерфейсов, при желании можно передать свои Destroyable и LiveDataDispatcher через конструктор.

Примеры

Простой пример ViewModel, через который можно получить список элементов и добавить один элемент.

class SomeViewModel (
        private val someRepository: SomeRepository
) : RxViewModel() {

    val itemsList = MutableLiveData<ContentEvent<List<Item>>>()

    fun getItemsList() {
        someRepository
                .getItems()
                .dispatchTo(itemsList)
    }

    fun addItem(item: Item) {
        someRepository
                .addItem(item)
                .untilDestroy()
    }
}

Подписка на события во ViewController. ContentEvent описан в модуле lifecycle.

someViewModel.itemsList.observe(this, Observer { event ->
    when (event) {
        is ContentEvent.Loading -> // do something
        is ContentEvent.Success -> // do something
        is ContentEvent.Error -> // do something
    }
})