Я слежу за реализацией MVI Каушиком Гопала с помощью ViewStates Observable и ViewEffects Observable. Пример можно посмотреть здесь: https://github.com/kaushikgopal/movies-usf/blob/master/app/src/main/java/co/kaush/msusf/movies/MSMovieVm.kt
Соответствующий фрагмент:
init {
eventEmitter
.doOnNext { Timber.d("[Event]: $it") }
.eventToResult()
.doOnNext { Timber.d("[Result]: $it") }
.share()
.also { result ->
viewStates = result
.resultToViewState()
.doOnNext { Timber.d("[ViewState]: $it") }
.replay(1)
.autoConnect(1) { disposable = it }
.distinctUntilChanged()
viewEffects = result
.resultToViewEffect()
.doOnNext { Timber.d("[ViewEffect]: $it") }
}
}
Основным отличием является то, что я использую фрагменты вместо действий. Все работает с первого раза, но когда я перехожу из фрагмента A во фрагмент B, а затем обратно во фрагмент A, наблюдаемый результат вызывает новые ViewStates, но не новые ViewEffects. Есть ли особый способ подписки / отписки, или я странным образом строю цепочку rx? В настоящее время я подписываюсь на ViewStates и ViewEffects Observables в onViewCreated()
и располагаю в onViewDestroyed()
. Я проверил, что оба Observables подписаны в каждом случае, просто когда я возвращаюсь к фрагменту A и вводю новые ViewEvents, я получаю новые ViewStates, но не ViewEffects. Может быть, это проблема мульти-кастинга?