You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is Android reactive MVVM library, fork https://github.com/dmdevgo/RxPM
3
+
Очередная библиотека Android Reactive MVVM, за основу взята https://github.com/dmdevgo/RxPM
4
+
5
+
Основная цель библиотеки, это организовать направление данных **View** <-> **ViewModel** и **сокрытия** методов по изменению состояния напрямую из **View**.
6
+
7
+
Пример такого сокрытия вы могли видеть (или применять) при использовании **LiveData**
8
+
9
+
```kotlin
10
+
prvate val_state=MutableLiveData<DataType>()
11
+
val state:LiveData<DataType> =_state
12
+
```
13
+
14
+
Вместо этого, библиотека предлагает делать это [так](#пример-viewmodel)
## Есть 5 базовых объектов для взаимодействия View и ViewModel
107
+
108
+
### RvmState
109
+
В основном предназначен для передачи состояния из **ViewModel** во **View**.
110
+
- Передавать данные в **RvmState** могут только наследники **RvmPropertiesSupport**.
111
+
- Всегда хранит последнее переданное значение.
112
+
- Каждый подписчик в первую очередь получит последннее сохраненное значение.
113
+
114
+
Объявление:
115
+
116
+
```kotlin
117
+
val state by RVM.state<DataType>(initialValue =nullor data)
118
+
```
119
+
```kotlin
120
+
val state by savedStateHandle.state<DataType>(initialValue =nullor data)
121
+
```
122
+
123
+
Подписка:
124
+
125
+
```kotlin
126
+
viewModel.state.observe { value ->/* do */ }
127
+
```
128
+
129
+
130
+
### RvmStateProjection
131
+
Почти тоже самое, что и **RvmState**, но отличается тем, что никто не может передавать данные напрямую.
132
+
- Никто не может передавать данные напрямую. **RvmStateProjection** может получать данные от источников: **Observable**, **RvmState**, **RvmStateProjection**, либо объекта наследника **RvmPropertyBase** и **RvmValueProperty**.
133
+
134
+
Объявление:
135
+
136
+
```kotlin
137
+
val state by RVM.state<DataType>(initialValue =nullor data)
138
+
val stateProjection by RVM.stateProjection(state) { /* map block */ }
139
+
```
140
+
```kotlin
141
+
val stateProjection by RVM.stateProjectionFromSource(initialValue =nullor data) { ObservableSource }
142
+
```
143
+
144
+
Подписка:
145
+
146
+
```kotlin
147
+
viewModel.stateProjection.observe { value ->/* do */ }
148
+
```
149
+
150
+
### RvmEvent
151
+
В основном предназначен для передачи событий или данных из **ViewModel** во **View**.
152
+
- Передавать данные в **RvmEvent** могут только наследники **RvmPropertiesSupport**.
153
+
- Хранит последнее переданное значение пока не появится подписчик. Только первый подписчик получит последнее сохраненное значение, все последующие подписки, будут получать только новые значения.
154
+
- Пока есть активная подписка, данные не сохраняются.
155
+
156
+
Объявление:
157
+
158
+
```kotlin
159
+
val event by RVM.event<DataType>()
160
+
```
161
+
```kotlin
162
+
val event by RVM.eventNone() // for Unit Data Type
163
+
```
164
+
165
+
Подписка:
166
+
167
+
```kotlin
168
+
viewModel.event.observe { value ->/* do */ }
169
+
```
170
+
171
+
### RvmConfirmationEvent
172
+
Почти тоже самое, что и **RvmEvent**, но отличается тем, что хранит последнее значение пока не будет вызван метод **confirm**.
173
+
- Передавать данные в **RvmConfirmationEvent** могут только наследники **RvmPropertiesSupport**.
174
+
- Хранит последнее переданное значение пока не будет вызван метод **confirm**. Каждый новый подписчик будет получать последнее сохраненное значение, пока не вызван метод **confirm**.
175
+
176
+
Объявление:
177
+
178
+
```kotlin
179
+
val confirmationEvent by RVM.confirmationEvent<DataType>()
180
+
```
181
+
```kotlin
182
+
val confirmationEvent by RVM.confirmationEventNone() // for Unit Data Type
183
+
```
184
+
185
+
Подписка:
186
+
187
+
```kotlin
188
+
viewModel.confirmationEvent.observe { value ->
189
+
/* do */
190
+
viewModel.confirmationEvent.confirm()
112
191
}
113
192
```
114
193
115
-
### State
116
-
**State** хранит послдение значение и излучает его при подписке. Используется для передачи значения из ViewModel в View
194
+
### RvmAction
195
+
В основном предназначен для передачи событий или данных из **View** во **ViewModel**.
196
+
- Не хранит данные.
197
+
198
+
Объявление:
117
199
118
-
Создание
119
200
```kotlin
120
-
valisProgress = state<Boolean>(false)
201
+
valaction by RVM.action<DataType>()
121
202
```
122
-
Из ViewModel
123
203
```kotlin
124
-
isProgress.consumer.accept(true)
125
-
isProgress.setValue(true) // расширение для isProgress.consumer.accept(true)
126
-
isProgress.setValueIfChanged(true) // расширение для isProgress.consumer.accept(true) но с проверкой if (lastValue != newValue)
204
+
val action by RVM.actionNone() // for Unit Data Type
127
205
```
128
-
В View
206
+
207
+
Привязка:
208
+
129
209
```kotlin
130
-
isProgress.observe { value -> }
210
+
viewModel.action.bindOnClick(someView)
131
211
```
132
212
133
-
### Action
134
-
**Action** ипользуется для передачи событий или параметров из View в ViewModel
213
+
## Также имеется 4 вспомогательных объекта для удобной связи View-элементов с ViewModel
214
+
215
+
### RvmCheckControl
216
+
Для связи **CompoundButton** и **ViewModel**.
217
+
218
+
Объявление:
135
219
136
-
Создание
137
220
```kotlin
138
-
valactionSendSmsCodeAgain = action<Unit>() // or actionEmpty() если тип Unit
221
+
valcheckControl by RVM.checkControl(initialChecked =false)
139
222
```
140
-
Из ViewModel
141
223
```kotlin
142
-
actionSendSmsCodeAgain.consumer.accept(Unit)
143
-
actionSendSmsCodeAgain.call() // расширение для actionSendSmsCodeAgain.consumer.accept(Unit)
224
+
val checkControl by savedStateHandle.checkControl(initialChecked =false)
0 commit comments