избавляет от хранения состояния в презентере • Множество callback-ов для реализации связанных состояний • Не совместим с реактивным программированием 24
val inProgress = BehaviorRelay.createDefault(false) val inProgressState = inProgress.asObservable() private val error = PublishRelay.create<String>() val errorObservable = error.asObservable() private val refreshAction = PublishRelay.create<Unit>() val refreshActionConsumer = refreshAction.asConsumer() RxPM 49
// init relay val observable = relay.asObservable() val value: T? get() = relay.value fun hasValue() = relay.hasValue() } // открываем доступ в Presentation Model protected val <T> State<T>.consumer: Consumer<T> get() = relay RxPM - State 53
// init relay val observable = relay.asObservable() val value: T? get() = relay.value fun hasValue() = relay.hasValue() } // открываем доступ в Presentation Model protected val <T> State<T>.consumer: Consumer<T> get() = relay // объявляем в Presentation Model val inProgress = State<Boolean>(false) RxPM - State 54
// init relay val observable = relay.asObservable() val value: T? get() = relay.value fun hasValue() = relay.hasValue() } // открываем доступ в Presentation Model protected val <T> State<T>.consumer: Consumer<T> get() = relay // объявляем в Presentation Model val inProgress = State<Boolean>(false) // consumer можно получить только в PM inProgress.consumer RxPM - State 55
// init relay val observable = relay.asObservable() val value: T? get() = relay.value fun hasValue() = relay.hasValue() } // открываем доступ в Presentation Model protected val <T> State<T>.consumer: Consumer<T> get() = relay // объявляем в Presentation Model val inProgress = State<Boolean>(false) // consumer можно получить только в PM inProgress.consumer // во View pm.inProgress.observable.bindTo(progressBar.visibility()) RxPM - State 56
consumer: Consumer<T> = relay } // открываем доступ в Presentation Model protected val <T> Action<T>.observable: Observable<T> get() = relay // объявляем в Presentation Model val clicks = Action<Unit>() RxPM - Action 59
consumer: Consumer<T> = relay } // открываем доступ в Presentation Model protected val <T> Action<T>.observable: Observable<T> get() = relay // объявляем в Presentation Model val clicks = Action<Unit>() // observable можно получить только в PM clicks.observable RxPM - Action 60
consumer: Consumer<T> = relay } // открываем доступ в Presentation Model protected val <T> Action<T>.observable: Observable<T> get() = relay // объявляем в Presentation Model val clicks = Action<Unit>() // observable можно получить только в PM clicks.observable // во View button.clicks().bindTo(pm.clicks.consumer) RxPM - Action 61
{ internal val relay = PublishRelay.create<T>() val observable = if (isIdle == null) relay.bufferWhileUnbind(bufferSize) else relay.bufferWhileIdle(isIdle, bufferSize) } // открываем доступ в Presentation Model protected val <T> Command<T>.consumer: Consumer<T> get() = relay // объявляем в Presentation Model val showError = Command<String>(bufferSize = 1) RxPM - Command 64
{ internal val relay = PublishRelay.create<T>() val observable = if (isIdle == null) relay.bufferWhileUnbind(bufferSize) else relay.bufferWhileIdle(isIdle, bufferSize) } // открываем доступ в Presentation Model protected val <T> Command<T>.consumer: Consumer<T> get() = relay // объявляем в Presentation Model val showError = Command<String>(bufferSize = 1) // consumer можно получить только в PM showError.consumer RxPM - Command 65
{ internal val relay = PublishRelay.create<T>() val observable = if (isIdle == null) relay.bufferWhileUnbind(bufferSize) else relay.bufferWhileIdle(isIdle, bufferSize) } // открываем доступ в Presentation Model protected val <T> Command<T>.consumer: Consumer<T> get() = relay // объявляем в Presentation Model val showError = Command<String>(bufferSize = 1) // consumer можно получить только в PM showError.consumer // во View pm.showError.observable.bindTo { // show alert dialog } RxPM - Command 66
во время поворота экрана • Базовые классы для реализации View • State, Action, Command • InputControl, CheckContol, ClickControl • Связывание свойств через bindTo и другие полезные расширения • Базовые классы для работы с Google Maps 93