
Framework enabling MVI pattern implementation with features like logging, time travel, and lifecycle-aware connections. Flexible architecture supports various reactive libraries or none, facilitating incremental adoption and experimentation.
Should you have any questions or ideas - there is Discussions section. Also welcome to the Kotlin Slack channel - #mvikotlin!
[!NOTE] This project is not stale; it is feature complete. I am actively keeping it up to date with necessary maintenance and updates.
MVI stands for Model-View-Intent. It is an architectural pattern that utilizes unidirectional data flow. The data circulates between Model and View only in one direction - from Model to View and from View to Model.
MVIKotlin is a Kotlin Multiplatform framework that provides a way of (not only) writing shared code using MVI pattern. It also includes powerful debug tools like logging and time travel. The main functionality of the framework does not depend on any reactive nor coroutines library. Extensions for Reaktive and for Coroutines libraries are provided as separate modules.
MVIKotlin does not bring or enforce any particular architecture. There is one primary responsibility of the library:
State. The scope is not defined, it can be a whole app, a screen, a feature, or a part of a feature.There are also two optional responsibilities, which the library can take care of for you:
Everything else is out of scope of the library, there are no definitions for "screens", "features", "modules", etc. Also, no particular reactive framework is enforced/exposed. This gives a lot of flexibility:
If you are using declarative UI frameworks (like Jetpack Compose, Multiplatform Compose by JetBrains, SwiftUI, React, etc.), then consider using Decompose for architecture. MVIKotlin plays nicely with Decompose.
Also one of the architecture approaches can be found in the samples.
Recommended minimum Gradle version is 5.3. Please read first the documentation about metadata publishing mode.
There are a number of modules published to Maven Central:
mvikotlin - core interfaces and functionality (multiplatform)mvikotlin-main - the main module with the default Store implementation (mutiplatform)mvikotlin-logging - logging functionality (mutiplatform)mvikotlin-timetravel - time travel feature (mutiplatform)mvikotlin-extensions-reaktive - extensions set for Reaktive library (multiplatform)mvikotlin-extensions-coroutines - extensions set for coroutines (multiplatform)keepers - provides StateKeeper and InstanceKeeper API for state preservation and objects retainingrx - a tiny module with abstractions over rx and coroutines (multiplatform)Add required modules to your module`s build.gradle file:
implementation "com.arkivanov.mvikotlin:<module-name>:<version>"4.0.0-alpha02)https://arkivanov.github.io/MVIKotlin
The sample project is a todo list with details view. There are two implementations of the same sample, one using Reaktive library and another one using coroutines. Each variant has Android, iOS and Web browser apps. This samples also demonstrates one of the possible architectures for a multiplatform project - each screen is represented by a controller class, platform applications integrate controllers and navigate between them.
There is another sample project available in forked repository of JetBrains/compose-jb - TodoApp. It uses MVIKotlin for business logic and Decompose for navigation.
Checkout a voluntary list of projects/companies using MVIKotlin: https://github.com/arkivanov/MVIKotlin/discussions/90. Feel free to add your project!
Twitter: @arkann1985
Should you have any questions or ideas - there is Discussions section. Also welcome to the Kotlin Slack channel - #mvikotlin!
[!NOTE] This project is not stale; it is feature complete. I am actively keeping it up to date with necessary maintenance and updates.
MVI stands for Model-View-Intent. It is an architectural pattern that utilizes unidirectional data flow. The data circulates between Model and View only in one direction - from Model to View and from View to Model.
MVIKotlin is a Kotlin Multiplatform framework that provides a way of (not only) writing shared code using MVI pattern. It also includes powerful debug tools like logging and time travel. The main functionality of the framework does not depend on any reactive nor coroutines library. Extensions for Reaktive and for Coroutines libraries are provided as separate modules.
MVIKotlin does not bring or enforce any particular architecture. There is one primary responsibility of the library:
State. The scope is not defined, it can be a whole app, a screen, a feature, or a part of a feature.There are also two optional responsibilities, which the library can take care of for you:
Everything else is out of scope of the library, there are no definitions for "screens", "features", "modules", etc. Also, no particular reactive framework is enforced/exposed. This gives a lot of flexibility:
If you are using declarative UI frameworks (like Jetpack Compose, Multiplatform Compose by JetBrains, SwiftUI, React, etc.), then consider using Decompose for architecture. MVIKotlin plays nicely with Decompose.
Also one of the architecture approaches can be found in the samples.
Recommended minimum Gradle version is 5.3. Please read first the documentation about metadata publishing mode.
There are a number of modules published to Maven Central:
mvikotlin - core interfaces and functionality (multiplatform)mvikotlin-main - the main module with the default Store implementation (mutiplatform)mvikotlin-logging - logging functionality (mutiplatform)mvikotlin-timetravel - time travel feature (mutiplatform)mvikotlin-extensions-reaktive - extensions set for Reaktive library (multiplatform)mvikotlin-extensions-coroutines - extensions set for coroutines (multiplatform)keepers - provides StateKeeper and InstanceKeeper API for state preservation and objects retainingrx - a tiny module with abstractions over rx and coroutines (multiplatform)Add required modules to your module`s build.gradle file:
implementation "com.arkivanov.mvikotlin:<module-name>:<version>"4.0.0-alpha02)https://arkivanov.github.io/MVIKotlin
The sample project is a todo list with details view. There are two implementations of the same sample, one using Reaktive library and another one using coroutines. Each variant has Android, iOS and Web browser apps. This samples also demonstrates one of the possible architectures for a multiplatform project - each screen is represented by a controller class, platform applications integrate controllers and navigate between them.
There is another sample project available in forked repository of JetBrains/compose-jb - TodoApp. It uses MVIKotlin for business logic and Decompose for navigation.
Checkout a voluntary list of projects/companies using MVIKotlin: https://github.com/arkivanov/MVIKotlin/discussions/90. Feel free to add your project!
Twitter: @arkann1985