Skip to content

Commit c1f5e11

Browse files
author
Alex
committed
Merge remote-tracking branch 'origin/master'
2 parents 47a0ed1 + 5ccc78a commit c1f5e11

File tree

1 file changed

+140
-2
lines changed

1 file changed

+140
-2
lines changed

README.md

Lines changed: 140 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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+
55
The 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

Comments
 (0)