11# ReactiveViewModel
22
3- It's a fork https://github.com/dmdevgo/RxPM
4-
3+ This is Android reactive MVVM library, fork https://github.com/dmdevgo/RxPM
4+
55The Status of the lib:
66[ ![ ] ( https://jitpack.io/v/AlexDeww/ReactiveViewModel.svg )] ( https://jitpack.io/#AlexDeww/ReactiveViewModel )
77
@@ -21,3 +21,141 @@ dependencies {
2121 implementation "com.github.AlexDeww:ReactiveViewModel:$last_version"
2222}
2323```
24+
25+ ### Пример ViewModel
26+ ``` kotlin
27+ class EnterSmsCodeViewModel (
28+ val fullPhoneNumber : String ,
29+ private val requestSmsCode : RequestSmsCode ,
30+ private val registerOrSignIn : RegisterOrSignIn
31+ ): ReactiveViewModel() {
32+ val isProgress = state(false )
33+
34+ val inputSmsCode = inputControl()
35+
36+ val actionSendSmsCodeAgain = emptyAction()
37+
38+ val eventError = event<Throwable >()
39+ val eventDone = emptyEvent()
40+ val eventShowSmsCode = event<String >()
41+
42+ init {
43+ inputSmsCode.text
44+ .observable
45+ .debounce(250 , TimeUnit .MILLISECONDS )
46+ .filter { it.length == SMS_CODE_LENGTH }
47+ .switchMapSingle {
48+ registerOrSignIn
49+ .asSingle(RegisterOrSignIn .Params (fullPhoneNumber, it))
50+ .bindProgress(isProgress.consumer)
51+ .doOnError(eventError.consumer)
52+ }
53+ .retry()
54+ .subscribe { eventDone.call() }
55+ .disposeOnCleared()
56+
57+ actionSendSmsCodeAgain
58+ .observable
59+ .filter { isProgress.value == false }
60+ .switchMap {
61+ requestSmsCode
62+ .asSingle(fullPhoneNumber)
63+ .bindProgress(isProgress.consumer)
64+ .doOnError(eventError.consumer)
65+ }
66+ .retry()
67+ .subscribe(eventShowSmsCode.consumer)
68+ .disposeOnCleared()
69+ }
70+ }
71+ ```
72+
73+ ### Связь с View
74+ ``` kotlin
75+ class EnterSmsCodeFragment : ReactiveFragment () {
76+
77+ companion object {
78+ private const val ARG_FULL_PHONE_NUMBER = " EnterSmsCodeFragment.ARG_FULL_PHONE_NUMBER"
79+
80+ fun create (fullPhoneNumber : String ): EnterSmsCodeFragment = EnterSmsCodeFragment ()
81+ .args { putString(ARG_FULL_PHONE_NUMBER , fullPhoneNumber) }
82+ }
83+
84+ private val viewModel by viewModel<EnterSmsCodeViewModel > { // koin!!!
85+ parametersOf(arguments?.getString(ARG_FULL_PHONE_NUMBER )!! )
86+ }
87+
88+ override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
89+ super .onViewCreated(view, savedInstanceState)
90+
91+ viewModel.isProgress.observe { if (it) showProgress() else hideProgress() }
92+
93+ viewModel.eventError.observe { showError(it) }
94+ viewModel.eventDone.observe { router.newRootScreen(Screens .Main .TripSetupFlowScreen ()) }
95+
96+ viewModel.inputSmsCode
97+ .bindTo(etSmsCode)
98+ .disposeOnDestroyView(" inputSmsCode" )
99+
100+ viewModel.actionSendSmsCodeAgain.bindOnClick(btnSendSmsAgain)
101+ }
102+
103+ }
104+ ```
105+
106+ ### State
107+ ** State** хранит послдение значение и излучает его при подписке. Используется для передачи значения из ViewModel в View
108+
109+ Создание
110+ ``` kotlin
111+ val isProgress = state<Boolean >(false )
112+ ```
113+ Из ViewModel
114+ ``` kotlin
115+ isProgress.consumer.accept(true )
116+ isProgress.setValue(true ) // расширение для isProgress.consumer.accept(true)
117+ isProgress.setValueIfChanged(true ) // расширение для isProgress.consumer.accept(true) но с проверкой if (lastValue != newValue)
118+ ```
119+ В View
120+ ``` kotlin
121+ isProgress.observe { value -> }
122+ ```
123+
124+ ### Action
125+ ** Action** ипользуется для передачи событий или параметров из View в ViewModel
126+
127+ Создание
128+ ``` kotlin
129+ val actionSendSmsCodeAgain = action<Unit >() // or emptyAction() если тип Unit
130+ ```
131+ Из ViewModel
132+ ``` kotlin
133+ actionSendSmsCodeAgain.consumer.accept(Unit )
134+ actionSendSmsCodeAgain.call() // расширение для actionSendSmsCodeAgain.consumer.accept(Unit)
135+ ```
136+ В View
137+ ``` kotlin
138+ actionSendSmsCodeAgain.bindOnClick(btnSendSmsCode)
139+ btnSendSmsCode.setOnClickListener { actionSendSmsCodeAgain.call() }
140+ ```
141+
142+ ### Event
143+ ** Event** ипользуется для передачи событий или параметров из ViewModel в View. Хранит последнее переданное значение, пока не появится подписчик.
144+
145+ Создание
146+ ``` kotlin
147+ val eventDone = event<Unit >() // or emptyEvent() если тип Unit
148+ ```
149+ Из ViewModel
150+ ``` kotlin
151+ eventDone.consumer.accept(Unit )
152+ eventDone.call() // расширение для eventDone.consumer.accept(Unit)
153+ ```
154+ В View
155+ ``` kotlin
156+ eventDone.observe { value -> }
157+ ```
158+
159+
160+ ## Инфо
161+ Вся либа, надстройка над LiveData. Cвойства(state, event) имею поле ** liveData** для возможности совместного использования с ** DataBinding**
0 commit comments