Kotlin-Android-Open-Source / MVI-Coroutines-Flow

Play MVI with Kotlin Coroutines Flow | MVI pattern on Android using Kotlin Coroutines Flow | Dagger Hilt DI | Koin DI | SharedFlow | StateFlow | Arrow.kt Android Sample
https://github.com/hoc081098
MIT License
855 stars 95 forks source link
android-arrow-kt android-mvi android-mvi-architecture android-mvi-flow android-mvi-sample arrow-kt coroutines coroutines-flow coroutines-flow-mvi dagger-hilt kotlin-android kotlin-coroutines kotlin-coroutines-flow mvi mvi-clean-architecture mvi-coroutines-flow mvi-coroutines-flow-kotlin sharedflow unidirectional-data-flow

MVI-Coroutines-Flow

MVI-Coroutines-Flow-Clean-Architecture

MVI-Coroutines-Flow-Clean-Architecture-ArrowKt

MVI-Coroutines-Flow-Clean-Architecture-ArrowKt-KoinDI

All Contributors

Build CI Unit Tests CI codecov Qodana Validate Gradle Wrapper API Kotlin Hits License: MIT Gitter


Liked some of my work? Buy me a coffee (or more likely a beer)

Buy Me A Coffee

Coroutine + Flow = MVI :heart:

More

1. Jetpack Compose Version

👉 https://github.com/Kotlin-Android-Open-Source/Jetpack-Compose-MVI-Coroutines-Flow

2. Pagination Horizontal List in Vertical List

👉 https://github.com/Kotlin-Android-Open-Source/Pagination-MVI-Flow

Light theme

List view state Error view state
Add new user Search user

Dark theme

List view state Error view state
Add new user Search user

MVI pattern

This pattern was specified by André Medeiros (Staltz) for a JavaScript framework he has written called cycle.js. From a theoretical (and mathematical) point of view we could describe Model-View-Intent as follows [^1]

- `intent()`: This function takes the input from the user (i.e. UI events, like click events) and translate it to “something” that will be passed as parameter to `model()` function. This could be a simple string to set a value of the model to or more complex data structure like an Object. We could say we have the intention to change the model with an intent. - `model()`: The `model()` function takes the output from `intent()` as input to manipulate the Model. The output of this function is a new Model (state changed). So it should not update an already existing Model. **We want immutability!** We don’t change an already existing Model object instance. We create a new Model according to the changes described by the intent. Please note, that the `model()` function is the only piece of your code that is allowed to create a new Model object. Then this new immutable Model is the output of this function. Basically, the `model()` function calls our apps business logic (could be an Interactor, Usecase, Repository … whatever pattern / terminology you use in your app) and delivers a new Model object as result. - `view()`: This method takes the model returned from `model()` function and gives it as input to the `view()` function. Then the View simply displays this Model somehow. `view()` is basically the same as `view.render(model)`. ### Reference - [Model-View-Intent Design Pattern on Android](https://xizzhu.me/post/2021-06-21-android-mvi-kotlin-coroutines-flow-compose/) - [Reactive Apps with Model-View-Intent](https://hannesdorfmann.com/android/mosby3-mvi-1/) ## Contributors ✨ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):


Petrus Nguyễn Thái Học

💻 🚧 🤔 🎨 🐛
This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! [^1]: https://hannesdorfmann.com/android/mosby3-mvi-2/