https://github.com/prongbang/mvi-rx
MVI = Rx3 + Relay Android
https://github.com/prongbang/mvi-rx
mvi mvi-android mvi-rxjava mvi-rxkotlin
Last synced: about 1 year ago
JSON representation
MVI = Rx3 + Relay Android
- Host: GitHub
- URL: https://github.com/prongbang/mvi-rx
- Owner: prongbang
- License: mit
- Created: 2021-09-22T15:51:22.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-09-23T06:29:57.000Z (over 4 years ago)
- Last Synced: 2025-03-25T22:52:06.861Z (about 1 year ago)
- Topics: mvi, mvi-android, mvi-rxjava, mvi-rxkotlin
- Language: Kotlin
- Homepage:
- Size: 117 KB
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# mvi-rx
[](https://jitpack.io/#prongbang/mvi-rx)
## Setup
- `build.gradle`
```groovy
buildscript {
repositories {
maven { url 'https://jitpack.io' }
}
}
```
- `settings.gradle`
```groovy
dependencyResolutionManagement {
repositories {
maven { url 'https://jitpack.io' }
}
}
```
- `app/build.gradle`
```groovy
implementation 'com.github.prongbang:mvi-rx:1.0.5'
```
## How to use
- MainIntent.kt
```kotlin
import com.prongbang.mvirx.RxIntent
sealed class MainIntent : RxIntent {
object GetData : MainIntent()
}
```
- MainSate.kt
```kotlin
import com.prongbang.mvirx.RxState
sealed class MainState : RxState {
object Idle : MainState()
data class Result(val data: String) : MainState()
}
```
- MainEffect.kt
```kotlin
import com.prongbang.mvirx.RxEffect
sealed class MainEffect : RxEffect {
object Idle : MainEffect()
data class Error(val data: String) : MainEffect()
}
```
- GetMessageUseCase.kt
```kotlin
import com.prongbang.mvirx.RxUseCase
import io.reactivex.rxjava3.core.Observable
class GetMessageUseCase : RxUseCase {
override fun execute(params: Unit): Observable {
return Observable.fromCallable {
"Hello MVI Rx"
}
}
}
```
- MainViewModel.kt
```kotlin
import com.prongbang.mvirx.RxViewModel
class MainViewModel(
private val getMessageUseCase: GetMessageUseCase
) : RxViewModel() {
override fun process(intent: MainIntent) {
when (intent) {
MainIntent.GetData -> processGetData()
}
}
private fun processGetData() {
getMessageUseCase.execute(Unit)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(onNext = { result ->
setState(MainState.Result(result))
}, onError = {
setEffect(MainEffect.Error("${it.message}"))
})
.addTo(compositeDisposable)
}
}
```
- MainActivity.kt
```kotlin
import com.prongbang.mvirx.RxViewRenderer
class MainActivity : AppCompatActivity(), RxViewRenderer {
private val mainViewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
mainViewModel.subscribe(::render, ::renderEffect)
mainViewModel.process(MainIntent.GetData)
}
override fun initObserve() {
mainViewModel.subscribe(::render, ::renderEffect)
}
private fun initLoad() {
mainViewModel.process(MainIntent.GetData)
}
override fun render(state: MainState) {
when (state) {
is MainState.Result -> {
findViewById(R.id.messageText).text = state.data
}
}
}
override fun renderEffect(effect: MainEffect) {
when (effect) {
is MainEffect.Error -> {
findViewById(R.id.messageText).text = effect.data
}
}
}
}
```
## Unit Test
```kotlin
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.observers.TestObserver
import org.junit.Test
class MainViewModelTest : CoreTest() {
@MockK
private lateinit var getMessageUseCase: GetMessageUseCase
private val viewModel by lazy { MainViewModel(getMessageUseCase) }
@Test
fun `Should return message when get message success`() {
// Given
val result = "Hello MVI Rx"
val testObserverState = TestObserver.create()
every { getMessageUseCase.execute(Unit) } returns Observable.just(result)
// When
viewModel.stateSubscribe(testObserverState)
viewModel.process(MainIntent.GetData)
// Then
testObserverState.assertValues(
MainState.Result(result)
)
}
}
```